关于javaScript中的全局变量和成员变量以及this在函数中的作用域问题?求教
this.name = "你好";
alert(this);//[object Window]
}
//box();
alert(name);//1.打印出来是空("")而不是undefined
//alert(this.kkkk);//不存在的变量打印出来是undefined
var a = "能看见我吗?";
(function boxx() {
alert(a); //2.打印出:undefined ??
var a = "Hi";
//alert(a); //正常打印出Hi
//如果把下俩段注释,则能打印出全局变量
})()
//为什么函数中的this作用域仍然会是Window?那用this点出的变量应该是全局??var修饰的呢?
//1,2的情况是怎么回事? 展开
所有的变量都应用var声明,只是习惯。不声明,也没事,只是js的解释器,帮你声明了,但是并不是所有的解释器会这么做,有些解释器会认为不声明就是错的。
至于你说的第一点:
name是系统保留字段,你用的浏览器保留了这个name变量。当你访问name的时候,实际访问的是this.name等价于window.name,这是浏览器的窗口的名字属性。原本就存在的。所以你显示的是"",而不是undefined。如果你把name变一个其他的名字,比如alert(miaoxiaoer);那么你就会显示undefined了,或者报错了。因为没声明变量啊。
第二点:
(function 这种形式通常用来划定一个命名空间,关于命名空间是干吗用的你可以百度详细一下。简单来说就是画一个圈圈,让圈圈内的变量和圈圈外的变量无安全隔离开,不能互相访问。所以你才会出现你的第二个alert变量a显示undefined,因为a在命名空间外被隔离了。
为什么(function 会隔离变量呢?答案就是第一个括号告诉系统,我这里有个没有名字的函数,下面的function会被当作参数传给这个函数。代码编写者利用参数不能访问函数外部的特性,来实现了js的命名空间的隔离效果。
this的范围:
在函数中,如果你的函数是在全局变量声明的。那this就是指代全局,在浏览器中通常就是window对象。
而如果你的this是在一个对象中,比如你声明了一个json对象,而json内的一个函数调用了this,那么这个this就是这个对象,而不是全局对象。
比如你在box函数后,加上这段代码:
var b ={};
b.box = box;
b.box();
这时候输出的this就是对象了,另外在apply 和 new对象的时候,也会把被new的对象传递给this,懂了吗?
原来name是保留字段...
但是第二点,我又试了一下,如果外面定了一个全局变量x,()()函数里打印全局x是可以正常打印的啊,但是在函数内再 var x重新定义一个成员就打印出undefined了.....
我们老师讲function 函数时是把他当做类,创作对象来讲的,所以作为普通方法调用时,我就混淆了,这样的话,如果作为方法,在函数中的this所点出的与不用var修饰的仍然是调用全局的变量了吧