简单谈谈javascript中this的隐式绑定
作者:bea
我们先来看一个例子 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 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每日必学之继承
- JS实现的仿QQ空间图片弹出效果代码
- 理解javascript封装
- 学习Javascript面向对象编程之封装
- javascript每日必学之封装
- jQuery常用知识点总结以及平时封装常用函数
- 使用Javascript实现选择下拉菜单互移并排序
- jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
- JavaScript tab选项卡插件实例代码
- Javascript技术栈中的四种依赖注入详解
- JQuery+EasyUI轻松实现步骤条效果
- 全面解析Bootstrap布局组件应用
- 基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
- JavaScript function函数种类详解
- JavaScript+html5 canvas实现图片破碎重组动画特效
- jQuery获取字符串中出现最多的数
- nodejs 中模拟实现 emmiter 自定义事件
- jQuery基于muipicker实现仿ios时间选择