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/

  • 相关阅读:
    Python:Lasso方法、GM预测模型、神经网络预测模型之财政收入影响因素分析及预测
    ARIMA模型构建、预测——基于Python
    家用电器用户行为分析与事件识别学习笔记
    JQData数据提取及MySQL简单操作——基于Python
    android 沉浸通知栏
    PullToRefreshScrollView 修改下拉刷新图标
    Android AlertDialog 设置setSingleChoiceItems不显示列表的原因【setMessage和setSingleChoiceItems不能同时使用】
    图片跑马灯抽奖,本地图片变换简单实现
    android知识点大总结
    Android 面试精华题目总结
  • 原文地址:https://www.cnblogs.com/zhaow/p/9754570.html
Copyright © 2011-2022 走看看