zoukankan      html  css  js  c++  java
  • 在函数作用域嵌套下使用this

    var myObj = {
        specialFunction: function () {
            console.log("specialFunction.");
        },
        anotherSpecialFunction: function () {
            console.log("anotherSpecialFunction.");
        },
        getAsyncData: function (cb) {
            cb();
        },
        render: function () {
            //通常用法:将上下文this缓存到一个变量中
            //以便在本函数作用域内包含另一个函数作用域的情况下可以继续使用此上下文对象this
            //如果省略这行,那么在嵌套函数作用域内就无法访问到本函数作用域的成员了。
            var that = this;
            this.getAsyncData(function () {
                that.specialFunction();
                that.anotherSpecialFunction();

            });
        }
    };
    myObj.render();
    //specialFunction.
    //anotherSpecialFunction.

    如果我们省略了var that = this,看看会是什么情况:
    var myObj = {
        specialFunction: function () {
            console.log("specialFunction.");
        },
        anotherSpecialFunction: function () {
            console.log("anotherSpecialFunction.");
        },
        getAsyncData: function (cb) {
            cb();
        },
        render: function () {
            this.getAsyncData(function () {
                //需要说明的是:下面两行在IDE中用this是.不出来的,说明它们不在当前作用域中(或者说是上下文中)
                //但是硬写上IDE中也不会报错,只在运行时会报错。
                this.specialFunction();
                this.anotherSpecialFunction();

            });
        }
    };
    myObj.render();
    //TypeError: Object [object global] has no method 'specialFunction'
    可以看出,因为嵌套函数之间没有继承关系,只有嵌套关系,所以一直查找到了全局作用域也没找到要调的方法。

    有一种方法可以代替var that = this,它就是 Function.prototype.bind()
    //下面我们改写代码:
    var myObj = {
        specialFunction: function () {
            console.log("specialFunction.");
        },
        anotherSpecialFunction: function () {
            console.log("anotherSpecialFunction.");
        },
        getAsyncData: function (cb) {
            cb();
        },
        render: function () {
            this.getAsyncData(function () {
                this.specialFunction();
                this.anotherSpecialFunction();

            } .bind(this));
        }
    };
    myObj.render();
    //specialFunction.
    //anotherSpecialFunction.
    但是,很不幸,Function.prototype.bind 在IE8及以下的版本中不被支持。

    关于Function.prototype.bind()的更多内容请见:http://blog.jobbole.com/58032/

  • 相关阅读:
    bzoj3676 [Apio2014]回文串
    bzoj4199 [Noi2015]品酒大会
    bzoj3171 [Tjoi2013]循环格
    bzoj4709 [Jsoi2011]柠檬
    bzoj2668 [cqoi2012]交换棋子
    bzoj1458 士兵占领
    25号搜索的一些例子,。。Oil Deposits&&Red and Black&&Knight Moves&&Catch That Cow&&Tempter of the Bone
    第一次超水(我错了,有难度的)的组队赛!!!The Coco-Cola Store &&Multiple of 17&& Box Game
    博弈 7月24号:HDU 2176(Nim博弈)
    2013年7月23号:大数的加与乘I-number&&Power of Cryptography
  • 原文地址:https://www.cnblogs.com/zhaow/p/9754570.html
Copyright © 2011-2022 走看看