JavaScript四种调用模式和this示例介绍


在JavaScript中,函数的调用模式决定了函数体内`this`的值。主要有四种调用模式:函数模式(Function Mode)、方法模式(Method Mode)、构造器模式(Constructor Mode)和上下文模式(Context Mode,也常称为call/apply/bind模式)。下面分别介绍这四种模式及`this`的示例。

### 1. 函数模式(Function Mode)

在普通函数调用时,`this`的值在非严格模式下是全局对象(在浏览器中是`window`对象),在严格模式下(`'use strict'`)是`undefined`。


function func() {
    console.log(this); // 非严格模式下指向全局对象,严格模式下是undefined
}

func(); // 非严格模式下,输出window;严格模式下,输出undefined

### 2. 方法模式(Method Mode)

当函数作为对象的方法被调用时,`this`的值是调用该方法的对象。


const obj = {
    method: function() {
        console.log(this); // 指向obj对象
    }
};

obj.method(); // 输出obj对象

### 3. 构造器模式(Constructor Mode)

当函数通过`new`关键字被调用时,它作为一个构造器函数。此时,`this`的值是新创建的对象实例。


function Constructor() {
    this.prop = 'I am an instance';
}

const instance = new Constructor();
console.log(instance.prop); // 输出:I am an instance

### 4. 上下文模式(Context Mode)

通过`call`、`apply`和`bind`方法,可以显式地设置函数执行时的`this`值。

- **call**:`func.call(thisArg, arg1, arg2, ...)`

- **apply**:`func.apply(thisArg, [argsArray])`

- **bind**:返回一个新的函数,这个新函数在调用时,`this`会被设置为`bind`的第一个参数,而剩余参数将作为新函数的参数,供调用时使用。


function greet(greeting, punctuation) {
    console.log(this.name + ' says: ' + greeting + punctuation);
}

const person = { name: 'John' };

greet.call(person, 'Hello', '!'); // John says: Hello!
greet.apply(person, ['Hi', '.']); // John says: Hi.

const boundGreet = greet.bind(person, 'Greetings');
boundGreet('???'); // John says: Greetings???

以上是JavaScript中四种调用模式和`this`的示例介绍。希望这能帮助你理解`this`在JavaScript中的行为。