本文通过多个代码实例深入解析JavaScript中this关键字的指向规则。文章详细说明了普通函数调用、对象方法调用以及构造函数中this的不同行为,特别探讨了函数return值对this指向的影响,并补充了严格模式下this默认为undefined的特性,帮助开发者准确理解并应用这一核心概念。
this关键字基础指向分析
本文通过具体代码示例,系统梳理了JavaScript中this关键字的使用场景与指向逻辑,旨在为读者提供清晰的参考。
例1:
function a(){
var user = "yao";
console.log(this.user);//undefined
console.log(this);//window
}
a();
该写法在逻辑上等同于:
function a(){
var user = "yao";
console.log(this.user);//undefined
console.log(this);//window
}
window.a();
此时,this指向全局对象window。
示例2:
var o = {
user:"yao",
fn:function () {
console.log(this.user);//yao
}
}
o.fn();
在此场景下,this指向对象o。
示例3:
var o = {
user:"yao",
fn:function () {
console.log(this.user);//yao
}
}
window.o.fn();
这里的this同样指向对象o。
var o = {
a:10,
b:{
a:12,
fn:function () {
console.log(this.a);//12
}
}
}
o.b.fn();
而在嵌套对象的方法中,this指向的是包含该方法的最内层对象b。
示例4:
函数分离调用时的this指向
var o = {
a:10,
b:{
a:12,
fn:function () {
console.log(this.a);//undefined
console.log(this);//window
}
}
};
var j = o.b.fn;
j();
综合上述情况,可以得出以下结论:
this的指向始终取决于最终调用该函数的对象。
当函数执行过程中遇到return语句时,情况会有所变化:
示例5:
构造函数中return对this的影响
function fn(){
this.user = "yao";
return {};
}
var a = new fn;
console.log(a.user);//undefined
示例6:
function fn(){
this.user = "yao";
return function(){};
}
var a = new fn;
console.log(a.user);//undefined
示例7:
function fn(){
this.user = "yao";
return 1;
}
var a = new fn;
console.log(a.user);//yao
示例8:
function fn(){
this.user = "yao";
return undefined;
}
var a = new fn;
console.log(a.user);//yao
如果构造函数返回一个对象,this将指向该返回的对象。
function fn(){
this.user = "yao";
return null;
}
var a = new fn;
console.log(a.user);//yao
尽管null在JavaScript中被归类为对象类型,但在使用new调用构造函数时,this依然指向新创建的实例。
严格模式下的this行为
补充说明:
在启用"use strict"严格模式的情况下,this的默认值不再是window,而是undefined。
如需了解更多JavaScript相关知识,建议查阅本站专题:《javascript面向对象入门教程》、《JavaScript常用函数技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》。
希望本文的解析能对大家的JavaScript编程实践有所帮助。