this绑定规则-默认绑定

88 阅读2分钟

默认绑定的概念

当函数以独立函数调用(而不是作为对象方法、使用 call/apply/bind 或作为构造函数调用)时,this 会使用默认绑定:

  1. 非严格模式下,this 会绑定到全局对象(浏览器中是 window,Node.js 中是 global
  2. 严格模式下,this 会绑定到 undefined
function foo1() {
    console.log(this)  // 输出当前调用上下文中的this
}

function foo2() {
    console.log(this)  // 输出当前调用上下文中的this
    foo1()             // 调用foo1(独立函数调用)
}

function foo3() {
    console.log(this)  // 输出当前调用上下文中的this
    foo2()             // 调用foo2(独立函数调用)
}
foo3

在调用的时候是独立的,所以打印出来的结果都是window image.png

var obj = {
    name: "why",
    foo: function() {
        console.log(this)  // 输出当前this指向
    }
}

var bar = obj.foo  // 将obj.foo函数赋值给bar变量
bar()              // 直接调用bar函数
  1. bar() 调用时的输出

    • 在浏览器非严格模式下输出:window 全局对象
    • 在严格模式下输出:undefined
  2. 原因解析

    • 虽然 foo 最初定义在 obj 对象中,但当通过 var bar = obj.foo 赋值后:

      • bar 只是一个独立的函数引用,与 obj 完全解耦
      • 直接调用 bar() 属于默认绑定规则this 不再指向 obj
function foo() {
  console.log(this)
}
var obj = {
    name: "why"
    foo: foo
}
var bar = obj.foo
bar() //window
  1. 函数引用赋值

    • var bar = obj.foo 只是获取了函数的引用,并没有保留obj的上下文关系
  2. 调用方式决定this

    • bar() 是直接函数调用(不是作为对象方法调用)
    • 在非严格模式下,普通函数调用的this默认指向全局对象(浏览器中是window
    • 严格模式下会输出undefined
  3. 与方法调用的区别

    • 对比obj.foo()会输出obj对象,因为:

      • 当作为方法调用时(obj.foo()),JavaScript会自动将this绑定到点前面的对象
function foo() {
    function bar() {
        console.log(this);  // 输出当前this指向
    }
    return bar;  // 返回内部函数bar
}

var fn = foo();  // 获取bar函数
fn();  // 调用bar函数
  1. fn() 调用时的输出

    • 在浏览器非严格模式下输出:window 全局对象
    • 在严格模式下输出:undefined
  2. 原因解析

    • 虽然 bar 是在 foo 函数内部定义的,但它被作为普通函数调用(fn()
    • 按照 JavaScript 的 默认绑定规则,独立函数调用的 this 指向全局对象(非严格模式)或 undefined(严格模式)
    • 闭包特性不会影响 this 的绑定规则