简单谈谈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 相关文章推荐
jQuery学习基础知识小结
Nov 25 Javascript
不同编码的页面表单数据乱码问题解决方法
Feb 15 Javascript
jQuery mobile 移动web(6)
Dec 20 Javascript
jquery+css3实现会动的小圆圈效果
Jan 27 Javascript
深入分析Javascript事件代理
Jan 30 Javascript
jquery单击事件和双击事件冲突解决方案
Mar 02 Javascript
jQuery对象与DOM对象转换方法详解
May 10 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
May 01 Javascript
vuejs中父子组件之间通信方法实例详解
Jan 17 Javascript
详解JS预解析原理
Jun 16 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
Oct 17 Javascript
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
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
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
PHP编码转换
2012/11/05 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
PDO::query讲解
2019/01/29 PHP
基于php+MySql实现学生信息管理系统实例
2020/08/04 PHP
javascript call方法使用说明
2010/01/11 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
2014/01/14 Javascript
javascript自定义的addClass()方法
2014/05/28 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
js调用webservice构造SOAP进行身份验证
2016/04/27 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
一个简易的js图片轮播效果
2017/07/22 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
JavaScript 判断浏览器是否是IE
2021/02/19 Javascript
跟老齐学Python之Import 模块
2014/10/13 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
2018/08/03 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
求职简历的自我评价怎样写好
2013/10/07 职场文书
公司培训欢迎词
2014/01/10 职场文书
禁烟标语大全
2014/06/11 职场文书
销售竞赛活动方案
2014/08/23 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js