关于javaScript中的全局变量和成员变量以及this在函数中的作用域问题?求教

functionbox(){this.name="你好";alert(this);//[objectWindow]}//box();alert(name);//1.打印出... function box() {

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的情况是怎么回事?
展开
 我来答
喵西奥尔
2017-04-05 · TA获得超过6.4万个赞
知道大有可为答主
回答量:1.8万
采纳率:61%
帮助的人:2766万
展开全部

所有的变量都应用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修饰的仍然是调用全局的变量了吧
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式