• 在函数作用域嵌套下使用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/

  • 相关阅读:
    主动找智能钥匙 PKE取代RKE是大势所趋
    OBD-II Protocol -- SAE J1850 VPW PWM
    STM32F4: GENERATING A SINE WAVE
    Using PWM Output as a Digital-to-Analog Converter
    Spartan-6
    MAX II Device Compatibility with 5.0-V CMOS Devices
    ARM FPGA Extended Memory Interface
    STM32 100 pin 多个外设译码方案
    SILICA Xynergy-M4 Board -- STM32F417 meets XILINX Spartan-6
    Xilinx Platform Usb Cable
  • 原文地址:https://www.cnblogs.com/zhaow/p/9754570.html
Copyright © 2020-2023  润新知