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

  • 相关阅读:
    (树的直径)第九届湘潭市大学生程序设计比赛 H-Highway
    (记忆化DFS)Codeforces Round #413 D-Field expansion
    (树状数组)Codeforces Round #413 C-Fountains
    (几何)LeetCode Weekly Contest 32 D-Erect the Fence
    LeetCode Weekly Contest 32 解题报告
    (贪心)华师大程序设计竞赛 F-丽娃河的狼人传说
    (最短路)AtCoder Beginner Contest 061 D
    Tinkoff Challenge
    Codeforces Round #410 (Div. 2) 解题报告
    (二叉树)UVA
  • 原文地址:https://www.cnblogs.com/skylar/p/3619337.html
Copyright © 2011-2022 走看看