目录
this是上下文执行程序时,系统直接传过来的一个隐式参数。可以理解为tthis指的是函数运行时所在的"环境",所以我们要找到this的指向就是看函数在什么环境下运行出来的。
1.全局上下文中的 this
:
- 在全局作用域中,浏览器环境下的
this
指向全局对象window
,而在 Node.js 环境下指向global
对象。
console.log(this);//Window
- 但在严格模式下,全局上下文中的
this
是undefined
。,在实际运行时根据js引擎的不同,展示的效果也不同,谷歌的v8引擎和ie的猴系列引擎在严格模式下,全文的上下文输出是window.
'use strict';
console.log(this); // window (理论应该输出undefined)
2.函数中的 this
:
当函数以普通函数(包括自执行函数)形式调用时,this指向全局对象window。
//普通函数
function showThis() {
console.log(this);
}
showThis(); // 输出: Window
//自执行函数
(function() {
console.log(this); // 在浏览器中通常指向全局对象(比如 window)
})();
当函数以普通函数(包括自执行函数)形式调用时,this
指向全局对象或 undefined
(在严格模式下)。
//严格模式下
'use strict';
// 普通函数
function showThis() {
console.log(this);
}
showThis(); // 输出:undefined
//自执行函数
(function() {
console.log(this); // undefined
})();
当函数作为对象的方法调用时(回调函数),this
指向调用该方法的对象;否则,this 的指向取决于函数被调用的上下文。(严格模式下也是这样)。
const obj = {
method: function () {
console.log(this); // 指向 obj 对象
}
};
obj.method(); // 此时 this 指向 obj 对象
在闭包函数中 this 同样取决于函数被调用的方式。。如果闭包函数被绑定到某个对象上,则 this 会指向该对象;否则,this 的指向取决于函数被调用的上下文。
const obj = {
name: "Alice",
sayHello: function () {
const innerFunction = () => {
console.log(this); // this 指向 obj 对象
};
innerFunction();
}
};
obj.sayHello(); // 输出:obj
使用 call
、apply
或 bind
可以显式指定函数内部 this
的值(详情请看笔记web学习笔记(三十二))。
3.箭头函数中的 this
:
箭头函数没有自己的 this
绑定机制,它会捕获所在上下文的 this
值。
在箭头函数中,this
的值由箭头函数定义时的外层作用域决定,而不是调用时的情况。
const obj = {
name: "Alice", // 定义了一个属性 name,值为 "Alice"
printName: function() { // 定义了一个方法 printName
const arrowFunc = () => { // 定义箭头函数 arrowFunc
console.log(this.name); // 输出当前对象的 name 属性值,这里的 this 指向 obj 对象
};
arrowFunc(); // 调用箭头函数 arrowFunc
}
};
obj.printName(); // 调用 obj 对象的 printName 方法,输出:Alice
这意味着箭头函数不能通过 call
、apply
或 bind
来改变 this
的指向。
4.构造函数中的 this
:
构造函数中this指向构造函数的实例对象
function Car(make, model) {
this.make = make; // 使用 this 设置实例对象的 make 属性
this.model = model; // 使用 this 设置实例对象的 model 属性
this.displayInfo = function() {
console.log(`This car is a ${this.make} ${this.model}.`);
};
}
// 使用构造函数创建两个 Car 实例对象
const car1 = new Car('Toyota', 'Corolla');
const car2 = new Car('Honda', 'Civic');
// 调用实例对象的方法来展示车辆信息
car1.displayInfo(); // 输出:This car is a Toyota Corolla.
car2.displayInfo(); // 输出:This car is a Honda Civic.
5.事件处理函数中的 this
:
在 JavaScript 中,事件处理函数中的 this
可能有以下几种情况:
-
指向触发事件的元素本身:当使用普通函数来处理事件,并且没有手动修改
this
的指向时,this
将指向触发事件的元素本身,即事件绑定的元素。<body> <button>单击</button> <script> var btn = document.querySelector('button'); btn.onclick = function () { console.log(this);//<button>单击</button> } </script> </body>
-
指向绑定后的对象:通过使用
bind
方法将函数绑定到指定的对象上,则事件处理函数中的this
将指向被绑定的对象,而不是触发事件的元素。<button id="myButton">点击我</button> <script> const myObject = { name: 'Alice', greet: function () { console.log( this);//此时this指向myObject。 } }; const button = document.getElementById('myButton'); button.addEventListener('click', myObject.greet.bind(myObject)); </script>
-
指向全局对象:在一些情况下,尤其是在箭头函数中,
this
可能指向定义时的环境的this
,通常是全局对象(如浏览器环境中的window
)。<script> // 定义一个对象 const myObject = { name: 'Alice', regularFunction: function () { setTimeout(function () { console.log(this); // 此时的this指向全局对象(浏览器环境中为window) }, 1000); }, arrowFunction: function () { setTimeout(() => { console.log(this); // 此时的this指向myObject对象 }, 1000); } }; // 调用对象方法 myObject.regularFunction(); myObject.arrowFunction(); </script>
总结:
- 在普通函数中谁调用它this就指向谁,
- 箭头函数没有this指向,他的this指向指向的时父级非箭头函数的this指向。
- 在构造函数中和class类中this指向的是new出的新的实例对象