2

来自 Javascript-花园:

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如果在全局范围内调用它,则指的是全局对象。但这里它是在函数内部调用的,它在方法内部(第一个示例)。为什么它准确地引用全局对象,而第二个示例没有?

4

3 回答 3

5

据我了解,如果在全局范围内调用它,则 this 指的是全局对象。

如果在没有显式上下文的情况下调用函数,则否this将引用默认对象。范围无关紧要。(在严格模式下,它将undefined改为引用)。

为什么它究竟是指全局对象

我们不知道它指的是什么。的值this取决于函数的调用方式,而不是它的定义方式。

现在您已经更新了示例,我们可以看到它是在没有上下文的情况下调用的,因此this(在内部函数中)将是默认对象,在 Web 浏览器中是默认对象window(它将undefined处于严格模式)。

而第二个例子没有?

在第二个示例中,不使用内部函数this(其值与前一个示例相同)。

第二个示例that改为使用。that在外部函数的范围内定义,并设置this为调用该函数时的任何值。

假设该函数被称为Foo.method()then (外部)this(因此that)将是Foo因为那是method被调用的上下文。

于 2013-04-03T09:17:55.670 回答
3

this定义函数时未设置函数中的 in 。它仅动态定义给函数调用的接收者。

如果你打电话foo.test(),就会this在。testfoo

但如果你这样做

var f = foo.test;
f();

然后thisin f(即foo.test) 将是外部对象(如果您在根级别执行它,则为窗口)。

这将与

foo.test.call(window);
于 2013-04-03T09:14:21.093 回答
0

第二个示例使用闭包将外部函数变量放在内部函数的作用域链上。

Foo.method = function() {
  var that = this;
  function test(){
    //This function has access to the outer variables scope chain.
  }
}
于 2013-04-03T09:16:15.983 回答