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. 各种Android UI开源框架 开源库

    各种Android UI开源框架 开源库 转 https://blog.csdn.net/zhangdi_gdk2016/article/details/84643668 自己总结的Android开源 ...

  2. Android插件化(三):OpenAtlas的插件重建以及使用时安装

    Android插件化(三):OpenAtlas的插件重建以及使用时安装 转 https://www.300168.com/yidong/show-2778.html    核心提示:在上一篇博客 An ...

  3. angular 中如何使用自定义组件

    1.创建header组件 ng g component components/header header.component.ts import { Component, OnInit } from ...

  4. Casbin 使用记录

    Casbin 是什么? 官方解释:Casbin是一个强大的.高效的开源访问控制框架,其权限管理机制支持多种访问控制模型. Casbin只负责访问控制.身份认证 authentication(即验证用户 ...

  5. Oracle系统表整理+常用SQL语句收集(转载)

    原文:https://www.cnblogs.com/jiangxinnju/p/5840420.html-- DBA/ALL/USER/V_$/GV_$/SESSION/INDEX开头的绝大部分都是 ...

  6. laravel原生sql

    转自:https://www.cnblogs.com/zouzhe0/p/6307077.html DB::insert(, ']); $user = DB::]); //我们还 可以看到在执行查询的 ...

  7. 【Leetcode_easy】784. Letter Case Permutation

    problem 784. Letter Case Permutation 参考 1. Leetcode_easy_784. Letter Case Permutation; 2. Grandyang; ...

  8. 《Fluid Engine Development》 学习笔记4-预测校正不可压缩SPH-PCISPH

    传统SPH方案的主要问题之一是时间步长限制.在原始的SPH中,我们首先从当前设置计算密度,使用EOS计算压强,应用压力梯度,然后运行时间积分.这个过程意味着只需要一定的压缩量就可以触发内核半径内的压力 ...

  9. 【ARM-Linux开发】如何使用opkg在RicoBoard上在线安装软件包

    类似于debian的apt-get,Redhat的yum类似,嵌入式Linux平台可以使用opkg实现在线安装软件包的功能,在我们提供的matrix文件系统中,已经包含了opkg工具,但是还没有配置一 ...

  10. 最新 花椒直播java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.花椒直播等10家互联网公司的校招Offer,因为某些自身原因最终选择了花椒直播.6.7月主要是做系统复习.项目复盘.Leet ...