闭包中的 this 对象

Posted czhyuwj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包中的 this 对象相关的知识,希望对你有一定的参考价值。

关于this对象

  在闭包中使用this对象也可能会导致一些问题。this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,

 function createFunction(){   alert(this); }; createFunction(); // window 

  而当函数被作为某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环节具有全局性,因此其this对象通常指向 window。

  但有时候由于编写闭包的方式不同,这一点可能不会那么明显。

 

var name = "The Window";
  var object = {
    name:"My Object",
    getNameFunc:function(){
      return function(){
        return this.name;
      };
    }
}
alert(object.getNameFunc()()); // "This Window 非严格模式下"

 

上面代码先创建了一个全局变量 name ,又创建了一个包含 name 属性的对象。 这个对象还包含一个方法--- getNameFunc(),它返回一个匿名函数,而匿名函数又返回 this.name。 由于getNameFunction()返回一个函数,因此调用object.getNameFunc()(),就会立即调用它返回的函数,结果就是返回一个字符串。然而,这个例子返回的字符串是"The Window" 既全局 name 变量的值。

为什么匿名函数没有取得其包含作用域(外部作用域)的this对象尼?

<1> 前面提到过,函数执行时活动对象自动会保存两个值,一个是 this 与 arguments . 内部函数搜索这两个值,只会搜索到其变量对象为止。因此永远不可能直接访问外部
函数中的这两个变量。 不过这可以使用一个变量来保存 this对象,这样就可以访问了 如下

var name = "The Window";
var object = {
  name:"My Object",
  getNameFunc:function(){
    var _this = this;
    return function(){
      return _this.name;
    };
  }
}
alert(object.getNameFunc()()); // "My Window 非严格模式下"

 

上述代码中 _this 变量来保存,而在定义闭包之后,闭包也可以访问这个变量,因为它是我们在包含函数中特意声明的一个变量。
即使返回后调用,其_this任然引用着 object, 所以调用 object.getNameFunc()()就返回了“My Object” 如下图

以上是关于闭包中的 this 对象的主要内容,如果未能解决你的问题,请参考以下文章

scala编程——函数和闭包

一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域

JavaScript this浅析

闭包和this

Groovy闭包中的this,owner和delegate

JavaScript——闭包与this对象以及window对象