• 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’ .

  • 相关阅读:
    makeBackronym
    Regular Ball Super Ball
    Svn忽略配置
    How does it work in C#?
    Counting sheep...
    Convert boolean values to strings 'Yes' or 'No'.
    codeforces 236A . Boy or Girl(串水问题)
    cocos2d-x3.0 解释具体的新的物理引擎setCategoryBitmask()、setContactTestBitmask()、setCollisionBitmask()
    ACM字符串处理算法经典:字符串搜索
    MessageFormat类别:快速格式化字符串
  • 原文地址:https://www.cnblogs.com/skylar/p/3619337.html
Copyright © 2020-2023  润新知