zoukankan      html  css  js  c++  java
  • 关于javascript闭包中的this对象

        我们知道,
    this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。《Javascript高级程序设计》

        在下面的例子中,理解闭包中的this对象。

    var name = "The Window";
    var object = {
        name: "My object",
        getNameFunc: function() {
            return function() {
                return this.name;
            };
        }
    }
    alert(object.getNameFunc()()); // "The Window"
     

        为什么最后的结果是"The Window"而不是object里面的name"My object"呢?

        首先,要理解函数作为函数调用和函数作为方法调用。

        我们把最后的一句拆成两个步骤执行:

    var first = object.getNameFunc();
    var second = first();

        其中第一步,获得的first为返回的匿名函数,此时的getNameFunc()作为object的方法调用,如果在getNameFunc()中使用this,此时的this指向的是object对象。

        第二部,调用first函数,可以很清楚的发现,此时调用first函数,first函数没有在对象中调用,因此是作为函数调用的,是在全局作用域下,因此first函数中的this指向的是window

        再看下面这句话:

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

    每个函数被调用时,其活动对象都会自动取得两个特殊变量:this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。  《Javascript高级程序设计》

        那么,如何获得外部作用域中的this呢?

        可以把外部作用域中的this保存在闭包可以访问到的变量里。如下:

    var name = "The Window";
    var object = {
        name: "My object",
        getNameFunc: function() {
            var that = this;   // 将getNameFunc()的this保存在that变量中
            var age = 15;
            return function() {
                return that.name;
            };
        }
    }
    alert(object.getNameFunc()());   // "My object"
     

        其中,getNameFunc()执行时的活动对象有:that/age/匿名函数,在执行匿名函数时,同时引用了getNameFunc()中的活动对象,因此可以获取that和age的值。但是由于是在全局环境中调用的匿名函数,因此匿名函数内部的this还是指向window。

    转载:https://www.cnblogs.com/nuanriqingfeng/p/5789003.html
  • 相关阅读:
    变色DNA(最短路思维题)
    Clairewd’s message(哈希模板+)
    Built(最小生成树+构图离散化)
    Palindrome Degree(hash的思想题)
    字符串哈希算法(以ELFHash详解)
    Making Genome in Berland (DFS+思维)
    统计难题(字典树模板)
    Buy Tickets(线段树单点更新,逆向思维)
    fPzByjvwjL
    Beauty of Array ZOJ
  • 原文地址:https://www.cnblogs.com/MisterZZL/p/10527137.html
Copyright © 2011-2022 走看看