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