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/

  • 相关阅读:
    spring Di依赖注入
    Spring cloud微服务安全实战-6-7jwt改造总结
    Spring cloud微服务安全实战-6-6jwt改造之日志及错误处理(2)
    Spring cloud微服务安全实战-6-5jwt改造之日志及错误处理(1)
    Spring cloud微服务安全实战-6-4权限控制改造
    Spring cloud微服务安全实战-6-3JWT改造之网关和服务改造
    Spring cloud微服务安全实战-6-2JWT认证之认证服务改造
    Spring cloud微服务安全实战-6-1本章概述
    Spring cloud微服务安全实战-5-12实现基于token的SSO(2)
    Spring cloud微服务安全实战-5-11实现基于token的SSO(1)
  • 原文地址:https://www.cnblogs.com/zhaow/p/9754570.html
Copyright © 2011-2022 走看看