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/

在函数作用域嵌套下使用this的更多相关文章

  1. Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链

    命名空间 -------‘’存放名字与值的关系”的空间 代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间: 在函数的运行中开辟的临时的空间叫做局部命名空间. 命名空间一共分为三种: ...

  2. 函数的进阶(动态参数,命名空间和作用域,函数的嵌套,gloabal和nonlocal关键字)

    1. 函数参数--动态传参 昨天已经解过了传参, 如果需要给一个函数传参,而参数又是不确定的. 或者我们给一个函数传很多参数, 我的形参就要写很多, 写起来就很麻烦, 这时我们可以考虑使用动态参数.形 ...

  3. day10 python学习 函数的嵌套命名空间作用域 三元运算 位置参数 默认参数 动态参数

    1.三元运算 #1.三元运算 利用已下方法就可以实现一步运算返回a b中大的值 def my_max(a,b): c=0 a=int(input('请输入')) b=int(input('请输入')) ...

  4. Python之函数2 嵌套,作用域和闭包(Day12)

    一.函数对象 1.函数是第一类对象,即函数可以当做数据传递 1.1 可以被引用 1.2 可以当做参数传递 1.3 返回值可以是函数 1.4 可以当做容器类型的元素 二.函数的嵌套 1.函数嵌套的调用: ...

  5. python day- 10 动态参数 函数的嵌套 命名空间和作用域 global和nolocal

    一.动态参数: 动态参数是形参的一类 分为:动态位置参数(* + 函数名)表示 调用后返回的是元祖 动态关键字参数(** + 函数名)表示 形参的排列顺序: 位置参数     >   动态位置参 ...

  6. python中函数的嵌套和作用域链

    1.三元运算if条件成立的结果 if 条件 else 条件不成立的结果例如: a=20 b=10 c=a if a>b else b print(c) 2.命名空间 全局命名空间:创建的存储“变 ...

  7. C++学习笔记----4.4 继承情况下的类作用域嵌套

    引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就好像这些成员 ...

  8. Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

    本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...

  9. day12(表达式,推导式,名称空间与作用域,函数的嵌套定义)

    一,复习 # 字符串的比较 # -- 按照从左往右比较每一个字符,通过字符对应的ascll进行比较 # print('a' > 'A') #True # print('ac' > 'ab' ...

随机推荐

  1. 8.3 Customizing Git - Git Hooks

    https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks https://github.com/git/git/blob/master/temp ...

  2. struts2之Action与JSP相互数据传递

    package com.loaderman.crm.action; import com.loaderman.crm.entity.User; import com.loaderman.crm.ser ...

  3. StringBuider类

    特点: 线程不安全的可变字符序列 ; 线程不安全对应的效率高 ; 用法同StringBuffer一致

  4. python小白之np功能快速查

    np一些用法 np.a np.array([1,2,3],dtype=int)  #建立一个一维数组, np.array([[1,2,3],[2,3,4]])  #建立一个二维数组. np.arang ...

  5. (十七)jdbc(Java Data Base Connectivity,java数据库连接)基础使用

    一.JDBC相关概念介绍 1.1 JDBC介绍 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC.这套接口由数据库厂商去实现,这样,开发人员只需要学习 ...

  6. idea的enable auto-import/内存设置

    设置pom.xml依赖的自动导入 设置idea的memory heap On the Help menu, click Edit Custom VM Options. Set the -Xmx opt ...

  7. 【数据库开发】C++测试redis中的publish/subscribe

    运用 http://blog.csdn.net/xumaojun/article/details/51558237 中的redis_publisher.hredis_publisher.cpp red ...

  8. 【计算机视觉】Selective Search for Object Recognition论文阅读1

    Selective Search for Object Recognition 作者: J. R. R. Uijlings, K. E. A. van de Sande, T. Gevers, A. ...

  9. Vue Router路由管理器介绍

    参考博客:https://www.cnblogs.com/avon/p/5943008.html 安装介绍:Vue Router 版本说明 对于 TypeScript 用户来说,vue-router@ ...

  10. boost::bind四种应用场景的例子

        普通函数 int f( int a, int b ){return a + b;}boost::bind( f, _1, 9 )( 1 ) 成员函数 struct demo{int f( in ...