JS闭包中的this对象

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

  下面代码很好的说明了这一点:

 1 var name = 'The Window';
 2 
 3 var object = {
 4     name : 'My Object',
 5     getNameFunc : function(){
 6         return function(){
 7             return this.name;
 8         }
 9     }
10 };
11 
12 alert(object.getNameFunc()());

 小贴士:我在写这行小代码的时候出了一个错,后来发现是一不留神name结尾的逗号写成了句号。注意,在定义对象字面量的过程中,各个属性之间要记得是用逗号分隔。

 弹窗结果:‘ The Window’

 问: 那么为什么匿名函数没有取得其包含作用域的this对象呢?

 答:每个函数在被调用时都会自动获取两个特殊变量:this  和 arguments。 内部函数在搜索这两个变量时,指挥搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。

 不过通过下面的代码可以做到这一点(直接访问外部函数中的变量):

var name = 'The Window';

var object = {
    name : 'My Object',
    getNameFunc : function(){
    var that = this;
     return function(){
         return that.name;
     };
    }
};

alert(object.getNameFunc()());

 弹窗显示: ‘My Object’

 不同之处在于把this对象赋给了一个that变量,即使在函数返回之后,that也仍然引用这object,所以会返回object。

 在有的特殊的情况下,this的值可能会发发生有意思的意外改变,下面代码:

var name = 'The Window';

var object = {
    name : 'My Object',
    getName : function(){
        return this.name;
    }
};

//alert(object.getName());
//alert((object.getName)());
alert((object.getName = object.getName)());

弹窗显示,前面两个都是‘My Object’ 后面一个是‘The Window’。

这是因为复制表达式 object.getName = object.getName这个复制表达式的值是函数本身,所以this不能得到维持,因此返回了‘The Window’ .

原文地址:https://www.cnblogs.com/skylar/p/3619337.html