简单谈谈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 相关文章推荐
Javascript 获取LI里的内容
Dec 17 Javascript
JS高级拖动技术 setCapture,releaseCapture
Jul 31 Javascript
学习从实践开始之jQuery插件开发 对话框插件开发
Apr 26 Javascript
html组件不可输入(只读)同时任何组件都有效
Apr 01 Javascript
js如何实现设计模式中的模板方法
Jul 23 Javascript
js取消单选按钮选中示例代码
Nov 14 Javascript
jQuery中ajax的load()与post()方法实例详解
Jan 05 Javascript
vue.js中Vue-router 2.0基础实践教程
May 08 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
Jul 17 Javascript
浅谈vue.js中v-for循环渲染
Jul 26 Javascript
vue实现学生录入系统之添加删除功能
Jul 11 Javascript
如何使用vue slot创建一个模态框的实例代码
May 24 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
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
JavaScript延迟加载
2021/03/09 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
python Django批量导入数据
2016/03/25 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
2019/08/05 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
python简单实现插入排序实例代码
2020/12/16 Python
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
Python如何定义一个函数
2015/09/01 面试题
人民教师求职自荐信
2014/03/12 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
关于环保的标语
2014/06/13 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
教师党员批评与自我批评发言稿
2014/10/15 职场文书
监护人证明
2015/06/19 职场文书
提档介绍信范文
2015/10/22 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书