来自Javascript-Garden:
Foo.method = function() {
function test() {
//this is set to the global object
}
test();
}
为了从测试中获得对Foo的访问,有必要在引用Foo的方法内部创建一个局部变量:
Foo.method = function() {
var that = this;
function test(){
//Use that instead of this here
}
test();
}
有人可以解释一下吗?据我所知,this
指的是全局对象,如果它在全局范围内调用的话。但是这里它被称为函数内部,它位于一个方法(第一个例子)中。为什么它确实引用了全局对象,而第二个例子却没有?
答案 0 :(得分:5)
据我了解,如果在全局范围内调用它,则指的是全局对象。
没有。如果在没有显式上下文的情况下调用函数,this
将引用默认对象。范围无关紧要。 (在严格模式下,它将引用undefined
代替。)
为什么它确实引用全局对象
我们无法分辨它的含义。 this
的值取决于函数的调用方式,而不是如何定义。
现在您已经更新了示例,我们可以看到它是在没有上下文的情况下调用的,因此this
(在内部函数中)将是默认对象,在Web浏览器中是window
(在严格模式下它将是undefined
。
而第二个例子没有?
在第二个示例中,内部函数不使用this
(它与前一个示例具有相同的值)。
第二个示例使用that
代替。 that
在外部函数的范围内定义,并设置为调用该函数时this
的值。
假设该函数被称为Foo.method()
,那么(外部)this
(因此that
)将是Foo
,因为这是method
的上下文被叫了。
答案 1 :(得分:3)
this
未设置。它只是动态定义到函数调用的接收者。
如果您致电foo.test()
,this
中的test
将为foo
。
但如果你这样做
var f = foo.test;
f();
然后this
中的f
(foo.test
)将成为外部对象(如果您在根级别执行它,则为窗口)。
与
相同foo.test.call(window);
答案 2 :(得分:0)
第二个示例使用闭包将外部函数变量放在内部函数的作用域链上。
Foo.method = function() {
var that = this;
function test(){
//This function has access to the outer variables scope chain.
}
}