在JavaScript中,this关键字的指向取决于它是如何被调用的。函数中的 this 在调用时是绑定的,完全取决于函数的调用位置,即函数的调用方式。要知道 this 指向什么,你必须知道相关函数是如何被调用的。本文详细为大家介绍关于js中this指向有几种情况,跟着小编一起详细了解下。
一、js中this指向有几种情况?
this 的指向取决于函数调用方式,常见有以下 5 种情况:
默认绑定
非严格模式下指向全局对象,严格模式下为 undefined。
javascriptfunction foo() { console.log(this); }foo(); // 浏览器: window / 严格模式: undefined
隐式绑定(对象方法调用)
指向调用方法的对象。
javascriptconst obj = { name: "Alice", sayHi: function() { console.log(this.name); } };obj.sayHi(); // 输出 "Alice"(this 指向 obj)
显式绑定
强制绑定 this 到指定对象。
javascriptfunction greet() { console.log(this.message); }greet.call({ message: "Hello" }); // 输出 "Hello"
new 绑定
指向新创建的实例对象。
javascriptfunction Person(name) { this.name = name; }const alice = new Person("Alice");console.log(alice.name); // 输出 "Alice"
箭头函数
继承外层作用域的 this,无自己的 this。
javascriptconst obj = { name: "Bob", sayHi: () => console.log(this.name) };obj.sayHi(); // 输出 undefined(外层可能是 window)
二、JavaScript 数组去重常用方法
1. 使用 Set(ES6+ 最简洁)
javascriptconst arr = [1, 2, 2, 3];const unique = [...new Set(arr)]; // [1, 2, 3]
2. 使用 filter + indexOf
javascriptconst unique = arr.filter((item, index) => arr.indexOf(item) === index);
3. 使用 reduce
javascriptconst unique = arr.reduce((acc, item) => acc.includes(item) ? acc : [...acc, item], []);
4. 对象键值去重
javascriptconst unique = Object.keys(arr.reduce((acc, item) => {acc[item] = true;return acc;}, {})); // 注意:结果为字符串数组
5. 排序后比较相邻元素
javascriptconst sorted = [...arr].sort();const unique = sorted.filter((item, i) => item !== sorted[i + 1]);
性能建议:
大数据量优先用 Set。
兼容性要求高用 filter + indexOf。
对象/复杂类型需自定义去重逻辑。
在JavaScript中,`this`的指向取决于函数的调用方式。普通函数作为回调时,this可能丢失绑定。this的取值是在函数被调用时确定的,而不是在函数被定义时确定的。