this 指向

如何改变函数的作用域

在 JavaScript 中,有几种方法可以改变函数的作用域(即改变函数内部的 this 指向):

1. 使用 call() 方法

call() 方法可以立即调用函数,并指定函数内部的 this 值。


function greet() {

  console.log(`Hello, ${this.name}`);

}

const person = { name: 'Alice' };

greet.call(person); // 输出: Hello, Alice

2. 使用 apply() 方法

apply() 方法与 call() 类似,但参数以数组形式传递。


function introduce(age, job) {

  console.log(`I'm ${this.name}, ${age} years old, working as ${job}`);

}

const person = { name: 'Bob' };

introduce.apply(person, [30, 'developer']);

// 输出: I'm Bob, 30 years old, working as developer

3. 使用 bind() 方法

bind() 方法会创建一个新函数,永久绑定 this 值。


function showName() {

  console.log(this.name);

}

const person = { name: 'Charlie' };

const boundShowName = showName.bind(person);

boundShowName(); // 输出: Charlie

4. 箭头函数

箭头函数不绑定自己的 this,它会捕获其所在上下文的 this 值。


const obj = {

  name: 'David',

  greet: function() {

    setTimeout(() => {

      console.log(`Hello, ${this.name}`);

    }, 100);

  }

};

obj.greet(); // 输出: Hello, David

5. 作为对象方法调用

当函数作为对象的方法调用时,this 会自动指向该对象。


const person = {

  name: 'Eve',

  greet: function() {

    console.log(`Hi, I'm ${this.name}`);

  }

};

person.greet(); // 输出: Hi, I'm Eve

选择哪种方法取决于你的具体需求:

  • 需要立即调用函数并改变 this:使用 call()apply()

  • 需要创建一个新函数并永久绑定 this:使用 bind()

  • 需要保持外层 this 的引用:使用箭头函数

function greet() {

console.log(Hello, ${this.name});

}

里面的this 输出什么?

在 JavaScript 中,函数内部的 this 值取决于 函数的调用方式,而不是函数的定义位置。

你的代码:


function greet() {

  console.log(`Hello, ${this.name}`);

}

这里的 this 是谁?

在严格模式('use strict')下,如果直接调用 greet()thisundefined

在非严格模式下,this 默认指向 全局对象(浏览器中是 window,Node.js 中是 global)。

示例分析:

情况 1:直接调用 greet()this 默认指向全局对象或 undefined


greet();

// 非严格模式:`this` = `window`(浏览器)或 `global`(Node.js)

// 严格模式:`this` = `undefined`(会报错:Cannot read property 'name' of undefined)

如果全局对象没有 name 属性,会输出 Hello, undefined

情况 2:绑定 thiscall / apply / bind


const person = { name: "Alice" };

greet.call(person); // `this` = `person`,输出:Hello, Alice

情况 3:作为对象方法调用(this 指向该对象)


const person = {

  name: "Bob",

  greet: greet

};

person.greet(); // `this` = `person`,输出:Hello, Bob

情况 4:箭头函数(this 继承外层作用域)


const obj = {

  name: "Charlie",

  greet: () => {

    console.log(`Hello, ${this.name}`); // `this` 不是 obj,而是外层作用域的 `this`

  }

};

obj.greet(); // 可能输出:Hello, undefined(取决于外层 `this`)

结论:

  • this 的值由调用方式决定,而不是定义位置。

  • 直接调用时,this 默认指向全局对象(非严格模式)或 undefined(严格模式)。

  • 可以使用 callapplybind 或对象方法调用改变 this

  • 箭头函数不会绑定自己的 this,而是继承外层作用域的 this

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容