隐式绑定: 通过某个对象进行调用,它的调用位置中,是通过某个对象发起的函数调用
object.fn(),object对象会被js引擎绑定到nf函数中的this中
一、
function foo() {
console.log(this)
}
// 独立函数调用
// foo()
var obj = {
name: "why",
foo: foo
}
obj.foo() // obj对象 { name: 'why', foo: [Function: foo] }
-
obj是一个对象,其中foo方法引用了外部的foo函数。 -
当通过
obj.foo()调用时,this指向 调用它的对象,即obj。 -
this的指向取决于函数的调用方式:- 直接调用
foo()→this指向全局对象(严格模式下是undefined)。 - 通过对象调用
obj.foo()→this指向obj。
- 直接调用
二、
var obj = {
name: "why",
eating: function() {
console.log(this.name + "在吃东西");
},
running: function() {
console.log(obj.name + "在跑步");
}
};
obj.eating();
obj.running();
var fn - obj.eating
fn() //this指向window,独立的函数
三、
// 定义 obj1 对象,包含 name 属性和 foo 方法
var obj1 = {
name: "obj1",
foo: function() {
console.log(this); // 打印当前 this 指向的对象
}
};
// 定义 obj2 对象,包含 name 属性和 bar 方法(bar 引用 obj1 的 foo 方法)
var obj2 = {
name: "obj2",
bar: obj1.foo
};
// 通过 obj2 调用 bar 方法
obj2.bar(); // 输出 obj2 对象
/* 执行结果:
{ name: 'obj2', bar: [Function: foo] }
*/
obj1包含name属性和foo方法,foo方法会打印thisobj2包含name属性和bar方法,bar直接引用了obj1.foo- 虽然
foo原本属于obj1,但通过obj2.bar()调用时,this指向调用者obj2