分别解释下js中默认绑定、隐式绑定、显式绑定、new绑定的区别

138 阅读2分钟

JavaScript 函数绑定的四种方式

在 JavaScript 中,函数的 this 关键字的绑定方式分为四种:默认绑定、隐式绑定、显式绑定和 new 绑定。理解这些绑定方式对于掌握 JavaScript 的执行上下文至关重要。

默认绑定

默认绑定是指当一个函数在全局作用域中调用时,this 的值指向全局对象。在浏览器环境中,全局对象是 window

function showThis() {
  console.log(this);
}

showThis(); // 输出: Window { ... }

当函数被调用时,如果没有其他的绑定方式,this 默认指向全局对象。在严格模式下,this 会是 undefined

"use strict";
function showThis() {
  console.log(this);
}

showThis(); // 输出: undefined

隐式绑定

隐式绑定发生在函数作为对象的方法被调用时。此时,this 的值指向调用该方法的对象。

const obj = {
  name: 'Alice',
  greet() {
    console.log(this.name);
  }
};

obj.greet(); // 输出: Alice

在这个例子中,greet 方法是 obj 对象的一个方法,因此在调用时,this 指向 obj

如果将方法赋值给另一个变量,失去隐式绑定,则 this 的值会变成默认绑定。

const greet = obj.greet;
greet(); // 输出: undefined (严格模式下) 或者 Window { ... }

显式绑定

显式绑定是通过 call()apply()bind() 方法来明确指定 this 的值。

  • call():立即调用函数,并指定 this 的值。
function greet() {
  console.log(this.name);
}

const user = { name: 'Bob' };
greet.call(user); // 输出: Bob
  • apply():与 call() 类似,但参数以数组的形式传入。
function introduce(greeting) {
  console.log(`${greeting}, my name is ${this.name}`);
}

const person = { name: 'Charlie' };
introduce.apply(person, ['Hello']); // 输出: Hello, my name is Charlie
  • bind():返回一个新的函数,并将 this 绑定到指定的对象,调用时不会立即执行。
function sayHello() {
  console.log(this.name);
}

const user1 = { name: 'David' };
const boundSayHello = sayHello.bind(user1);
boundSayHello(); // 输出: David

new 绑定

当一个函数被作为构造函数调用时,this 的值指向新创建的对象。使用 new 关键字调用一个函数会创建一个新的对象,并将其绑定到 this

function Person(name) {
  this.name = name;
}

const person1 = new Person('Eve');
console.log(person1.name); // 输出: Eve

在这个例子中,new 关键字创建了一个 Person 的实例,this 指向新创建的 person1 对象。

总结

  • 默认绑定:函数在全局作用域中调用,this 指向全局对象。
  • 隐式绑定:函数作为对象的方法调用,this 指向调用该方法的对象。
  • 显式绑定:使用 call()apply()bind() 明确指定 this 的值。
  • new 绑定:构造函数调用时,this 指向新创建的对象。

理解这些绑定方式将帮助您更好地管理 JavaScript 中的 this 关键字,避免常见的错误。掌握这些概念是编写高效和可维护代码的基础。