this绑定规则-隐式绑定

107 阅读1分钟

隐式绑定: 通过某个对象进行调用,它的调用位置中,是通过某个对象发起的函数调用

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 方法会打印 this
  • obj2 包含 name 属性和 bar 方法,bar 直接引用了 obj1.foo
  • 虽然 foo 原本属于 obj1,但通过 obj2.bar() 调用时,this 指向调用者 obj2