zoukankan      html  css  js  c++  java
  • 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’ .

  • 相关阅读:
    PythonStudy——数据类型总结 Data type summary
    PythonStudy——可变与不可变 Variable and immutable
    PythonStudy——列表操作 List operatio
    PythonStudy——列表的常用操作 List of common operations
    PythonStudy——列表类型 List type
    PythonStudy——字符串扩展方法 String extension method
    PythonStudy——字符串重要方法 String important method
    AWT,Swing,RCP 开发
    JQuery插件机制
    最新知识网站
  • 原文地址:https://www.cnblogs.com/skylar/p/3619337.html
Copyright © 2011-2022 走看看