简单谈谈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 textlimit 显示用户输入的字符数 限制用户输入的字符数
May 14 Javascript
JQuery 操作/获取table具体代码
Jun 13 Javascript
jQuery实现html表格动态添加新行的方法
May 28 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
Jan 27 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
May 17 Javascript
jQuery.datatables.js插件用法及api实例详解
Oct 28 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
Mar 13 Javascript
Vee-Validate的使用方法详解
Sep 22 Javascript
vue裁切预览组件功能的实现步骤
May 04 Javascript
ES6的解构赋值实例详解
May 06 Javascript
NUXT SSR初级入门笔记(小结)
Dec 16 Javascript
VUE中使用HTTP库Axios方法详解
Feb 05 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
建立文件交换功能的脚本(二)
2006/10/09 PHP
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
详解PHP归并排序的实现
2016/10/18 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
深入理解js promise chain
2016/05/05 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
大学新生军训感言
2014/02/25 职场文书
文化建设工作方案
2014/05/12 职场文书
党员自我剖析材料范文
2014/10/06 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
行政前台岗位职责
2015/04/16 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS
HttpClient实现表单提交上传文件
2022/08/14 Java/Android