我试图理解为什么内部函数在直接调用外部函数时可以访问外部函数的公共属性,而不是在将其赋值给变量时?
示例:
function outer(x,y){
this.x = x;
this.y = y;
function inner(){
alert(this.x);
}
inner();
}
outer(1,2); //As expected, alerts 1
var func = outer(1,2) //Also alert 1
var func2 = new outer(1,2); //Alerts undefined
我尝试过的一件事是从this
删除alert(this.x);
关键字,它确实适用于所有三种情况。但是,如果我删除this
关键字,我将访问传入的参数,而不是公共变量,这绝对不是所需的操作。有人可以解释这种行为吗?
答案 0 :(得分:17)
当你像outer(1, 2)
那样召唤时,this
是window
的引用,所以“x”和“y”实际上是全局变量。这就是inner()
可以访问“x”的原因。
当您致电new outer(1, 2)
时,您已将this
(在“外部”中)作为对新对象的引用。当在“外部”内部调用“内部”时,this
仍将引用window
,因此没有“x”。
每个函数调用都会确定this
的值,该值仅取决于该调用的详细信息。因此,您通过new
调用“外部”的事实对内部调用“内部”没有影响 - 因为您只需将函数称为inner();
,其中this
的值为函数将是window
的引用(嗯,全局上下文,无论是什么)。
以下是调用函数时可以设置this
的方法:
new
运算符调用该函数,则this
将引用新创建的对象。foo.someFunction()
)的属性查找获得对函数的引用,则this
将是对该对象的引用。.call()
或.apply()
调用的,那么this
将引用第一个参数,使用这些函数中的任何一个,强制转换为对象值如果有必要的话。this
将引用全局上下文(浏览器中的window
)。 编辑 - ŠimeVidas在上面的评论中指出,在严格模式下,这种情况导致this
为null
(这实际上更有意义,并且会避免OP中观察到的怪异。答案 1 :(得分:6)
在Javascript中有4种方法可以使用函数
每个人所做的是改变this
的内容:
在你的情况this == window
直接调用函数(outer()
),但如果使用new(new outer()
)调用,则它将是您正在创建的新对象。
基本上我写的是here