" this
关键字始终引用包含函数的方法的对象。"
很棒,听起来很简单,但这就是我想知道的......
例如:
function func1() {
function func2() {
alert(this == window); // true
}
func2();
alert(this == window); // true
}
func1.func3 = function () {
alert(this == window); // false
alert(this == func1); // true
};
func1();
func1.func3();
现在,因为func1
实际上是全局(window
)对象的一种方法(一个分配给的属性func1
的函数对象> global object)this
内func1
引用全局对象是合理的,因为func3
是{{1}的方法在func1
内this
引用func3
的函数对象是有意义的。
困扰我的是func1
。我知道嵌套函数中的func2
也应该引用全局对象,但我不确定为什么因为this
不是<的方法em>全局对象。据我所知(这是我可能完全错误的部分)func2
是func2
调用(激活/变量)对象的方法。现在,如果我对此(我不确定自己)是对的,那么func1
内this
func2
不应提及func1
&# 39; s调用对象而不是全局对象?
所以,我想我的问题是:嵌套函数是嵌套函数的调用(激活)对象的方法,如果是,不应该{t = {1}}指的是调用对象而不是全局对象?
答案 0 :(得分:5)
this关键字始终引用包含函数的方法的对象。
没有。不幸的是,这并不容易。 MDN的documentation of the this
keyword给出了很好的概述。当函数作为方法 on 被调用时,它被设置为对象,但还有其他可能性。默认情况下,this
在undefined
被调用时没有任何特殊情况,就像您使用func1
和func2
一样。对于草率(非严格)模式函数undefined
(和null
)不使用,this
确实指向全局对象(浏览器中为window
)那种情况 - 你在观察什么。
但是当函数作为构造函数(使用new
关键字)调用时,它也可以指向新鲜的对象实例,或者在用作处理程序时指向事件目标(如DOM元素)。最后但并非最不重要的是,可以使用call
,apply
或bind
手动设置...
this
与嵌套无关。嵌套函数声明/表达式仅影响变量的范围(“隐私”,可用性)。虽然函数的变量范围永远不会改变,但this
的值在每次调用时都可能不同 - 它更像是一个额外的参数。
答案 1 :(得分:3)
函数内this
关键字的含义取决于函数的调用方式。 JavaScript中有4种不同的函数调用模式。
foo()
o.foo()
new foo
foo.apply(...)
或foo.call(...)
仅在#2中,函数内的this
引用函数是方法的对象。
您正在使用函数调用模式调用func2()
。执行此操作时,this
引用全局对象。
正如@Bergi所建议的,请参阅https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this以获取有关this
含义和不同函数调用模式的更多详细信息。
答案 2 :(得分:1)
但我不确定为什么因为func2不是全局对象的方法。
函数内定义的任何内容都是该函数范围的本地内容。因此func2
属于func1
的本地范围,因此未附加到window
。
在Javascript中,this
的值通常基于您调用函数的方式。当您调用没有任何前导对象的函数时,this
通常设置为全局父对象,即window
。
您可以通过三种方式明确设置this
的值:
myObj.func(a, b); //this set to myObj implicitly because myObj is the parent
func.call(myObj, a, b); //this set to myObj explicitly; the first argument
//to call sets the value of this for that function
func.apply(myObj, [a, b]); //this set to myObj explicitly; the first argument
//to apply also sets the value of this for that
//function.
this
可能是一个棘手的概念。 MDN的good article约为this
。