在之前的一篇文章《this绑定》中已经说过this绑定的四种情况,也谈到了this绑定丢失的问题,但是没有解释为什么会出现this绑定的丢失,最近在多次阅读关于this绑定方面的文章之后,发现:

  其实多数情况下,是不会发生this绑定丢失的,只有一种情况下会丢失,函数没有执行,当做值传递了。不管是赋值操作,还是当做回调函数的参数传递。

  从《你不知道的javascript上》截取两个示例:  

function foo() {
console.log( this.a );
} var obj = {
a: 2,
foo: foo
}; var bar = obj.foo; // function reference/alias! var a = "oops, global"; // `a` also property on global object bar(); // "oops, global"

  很容易看到,var bar = obj.foo; obj.foo并没有执行,而是直接赋值给了bar,所以在bar调用时,不存在任何上下文执行环境,就应用了默认绑定,非严格模式下,this绑定到window,而严格模式下,绑定到undefined。

function foo() {
console.log( this.a );
} function doFoo(fn) {
// `fn` is just another reference to `foo` fn(); // <-- call-site!
} var obj = {
a: 2,
foo: foo
}; var a = "oops, global"; // `a` also property on global object doFoo( obj.foo ); // "oops, global"

  在执行doFoo()函数时,obj.foo是当做参数传递的,并没有发生函数执行的过程,向上查找,obj.foo 其实就等于 foo,所以在doFoo内部调用的时候,依然是默认绑定规则。

  这么理解的话,是不是更容易理解所谓的this绑定的隐式绑定丢失的问题了。

this绑定丢失的问题的更多相关文章

  1. JavaScript中的this绑定丢失及解决方法

    经常犯的错误:混淆了this绑定规则. 代码如下: var obj = { id: 'vexekefo', cool() { console.log(this.id); } }; var id = ' ...

  2. this绑定

    js中关于this的用法,在初期时候经常会弄混,即使现在,也不敢说就一定不会混,但是起码好很多了. 函数执行过程中,主要有4种方法决定this的绑定对象. 分别为:默认绑定.隐式绑定. 显示绑定和ne ...

  3. 【javascript】函数中的this的四种绑定形式

    目录 this的默认绑定 this的隐式绑定 隐式绑定下,作为对象属性的函数,对于对象来说是独立的 在一串对象属性链中,this绑定的是最内层的对象 this的显式绑定:(call和bind方法) n ...

  4. this的四种绑定形式

    一 , this的默认绑定 当一个函数没有明确的调用对象的时候,也就是单纯作为独立函数调用的时候,将对函数的this使用默认绑定:绑定到全局的window对象. 一个例子 function fire ...

  5. 【javascript】函数中的this的四种绑定形式 — 大家准备好瓜子,我要讲故事啦~~

       javascript中的this和函数息息相关,所以今天,我就给大家详细地讲述一番:javascript函数中的this   一谈到this,很多让人晕晕乎乎的抽象概念就跑出来了,这里我就只说最 ...

  6. 【进阶3-1期】JavaScript深入之史上最全--5种this绑定全面解析(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记  https://github.com/yygmind/blog/issues/20 this的绑定规则总共有下面5种. 1.默认绑定(严格/非严 ...

  7. MVC复杂类型的模型绑定

    1,属性为引用类型(非集合,非数组) //模型1 public class Contact { public string Name { get; set; } public string Phone ...

  8. 函数中的this的四种绑定形式

    目录 this的默认绑定 this的隐式绑定 隐式绑定下,作为对象属性的函数,对于对象来说是独立的 在一串对象属性链中,this绑定的是最内层的对象 this的显式绑定:(call和bind方法) n ...

  9. js 五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解

     壹 ❀ 引 可以说this与闭包.原型链一样,属于JavaScript开发中老生常谈的问题了,百度一搜,this相关的文章铺天盖地.可开发好几年,被几道this题安排明明白白的人应该不在少数(我就是 ...

随机推荐

  1. 导入导出Excel文件

    搭建环境 先新建web project ,然后Add Struts Capabilties: 下载导入导出Excel所需的jar包: poi-3.8-20120326.jar包  :  http:// ...

  2. MeshLab显示纹理贴图

    共需要三个文件:obj文件.mtl文件及一张纹理图. 1.obj文件需要满足如下格式: 顶点 v 纹理坐标 vt 法线 vn 面片f Vertex1/Texture1/Normal1 Vertex2/ ...

  3. Python依赖打包发布详细

    http://www.cnblogs.com/mywolrd/p/4756005.html 将Python脚本打包成可执行文件   Python是一个脚本语言,被解释器解释执行.它的发布方式: .py ...

  4. WPF实现打印用户界面功能

    方式一:public bool Print(string pathStr) { try { if (File.Exists(pathStr) == false) return false; var p ...

  5. html多个水平并列组件自适应等高的做法

    做一个div盒子,设置over-flow:hidden,设置高度为auto.然后再盒子里排列若干inline-block,inline元素. 自适应的话常用做法是用line-height,font-s ...

  6. javascript 判断是否移动客户端 userAgent isMobile

    var isMobile = { Android: function () { return (/android/i.test(navigator.userAgent.toLowerCase())); ...

  7. 纯css实现

    实现此效果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22  <!DOCTYPE html><html lang=& ...

  8. vue cli 配置信息说明

    摘自csdn http://blog.csdn.net/hongchh/article/details/55113751

  9. django之创建项目,添加app

    一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python man ...

  10. QQ在开发中的应用

    1 截图 2 快捷回复 1svn更新 2美术资源替换 3后端服务器模块确认 4开会吧 5策划更新