'this'在函数VS'this'中的一个方法

时间:2013-04-03 09:12:07

标签: javascript this

来自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指的是全局对象,如果它在全局范围内调用的话。但是这里它被称为函数内部,它位于一个方法(第一个例子)中。为什么它确实引用了全局对象,而第二个例子却没有?

3 个答案:

答案 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中的ffoo.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.
  }
}