函数中的'this' VS 方法中的'this'



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.
  }
}

最新更新