简单谈谈javascript中this的隐式绑定


Posted in Javascript onFebruary 22, 2016

我们先来看一个例子

function foo() {
  console.log( this.a );
}
var obj = {
  a: 2,
  foo: foo
};
obj.foo(); // 2

this指向了obj,因为foo执行时的call-site(可以理解为调用时所在作用域)在obj上面。注意是运行的时候,和在哪里声明的没有关系。

call-site and call-stack

call-site姑且理解为调用域,call-stack为调用栈。如下代码可以辅助我们理解

function baz() {
  // call-stack is: `baz`
  // so, our call-site is in the global scope

  console.log( "baz" );
  bar(); // <-- call-site for `bar`
}

在baz()中调用bar(),所以bar的调用域是baz,此时bar的调用栈只有baz;而baz本身暴露在全局作用域中,所以它的调用域则也在全局作用域中。

function bar() {
  // call-stack is: `baz` -> `bar`
  // so, our call-site is in `baz`
  console.log( "bar" );
  foo(); // <-- call-site for `foo`
}
function foo() {
  // call-stack is: `baz` -> `bar` -> `foo`
  // so, our call-site is in `bar`
  console.log( "foo" );
}
baz(); // <-- call-site for `baz`

理解之后再回头看开头的例子,是不是感觉清晰了很多。其实this只是指向了它的call-site

还有如下玩法:

function foo() {
  console.log( this.a );
}
var obj2 = {
  a: 42,
  foo: foo
};
var obj1 = {
  a: 2,
  obj2: obj2
};
obj1.obj2.foo(); // 42
Implicitly Lost(隐式丢失)
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"

虽然bar引用了obj上的foo,但实际上相当于是直接对foo引用而已,所以会默认绑定到全局。

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"
Javascript 相关文章推荐
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
Feb 22 Javascript
event.X和event.clientX的区别分析
Oct 06 Javascript
jQuery LigerUI 使用教程表格篇(1)
Jan 18 Javascript
script标签属性type与language使用选择
Dec 02 Javascript
jquery中的查找parents与closest方法之间的区别
Dec 02 Javascript
用js写的一个路由(简单实例)
Sep 24 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
Aug 15 Javascript
JS中双击和单击事件冲突的解决方法
Apr 09 Javascript
JS实现提示效果弹出及延迟隐藏的功能
Aug 26 Javascript
es6函数之尾递归用法实例分析
Apr 25 Javascript
JS 数组和对象的深拷贝操作示例
Jun 06 Javascript
微信小程序实现翻牌抽奖动画
Sep 21 Javascript
javascript实现一个简单的弹出窗
Feb 22 #Javascript
Js的Array数组对象详解
Feb 22 #Javascript
AngularJS中使用HTML5手机摄像头拍照
Feb 22 #Javascript
JS字符串的切分用法实例
Feb 22 #Javascript
JS实现上下左右对称的九九乘法表
Feb 22 #Javascript
基于Javascript实现倒计时功能
Feb 22 #Javascript
TypeOf这些知识点你了解吗
Feb 21 #Javascript
You might like
国内咖啡文化
2021/03/03 咖啡文化
php+mysqli数据库连接的两种方式
2015/01/28 PHP
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
JS按位非(~)运算符与~~运算符的理解分析
2011/07/31 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
jQuery调取jSon数据并展示的方法
2015/01/29 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
详解tween.js的使用教程
2017/09/14 Javascript
实现单层json按照key字母顺序排序的示例
2017/12/06 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
Vue数据绑定实例写法
2019/08/06 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
Python中的fileinput模块的简单实用示例
2015/07/09 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
python按照多个条件排序的方法
2019/02/08 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
python如何调用java类
2020/07/05 Python
Python 中如何写注释
2020/08/28 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
城建学院毕业生自荐信
2014/01/31 职场文书
解除劳动合同协议书
2014/04/14 职场文书
端午节活动总结
2014/08/26 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
公安机关纪律作风整顿剖析
2014/10/10 职场文书
Html5页面播放M4a音频文件
2021/03/30 HTML / CSS
python实现简单区块链结构
2021/04/25 Python
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android