this的指向问题
全局作用域
在JS中,全局的变量和函数附着在global
对象上,全局对象在浏览器环境下是window
对象。
- 在全局作用域中,
this
指向全局对象window
。
console.log(this); // window对象
console.log(window); // window对象
console.log(this === window); // true
var a = 3;
console.log(a); // 3
console.log(window.a); // 3
console.log(this.a); // 3
console.log(a === window.a && window.a === this.a); // true
function say(){
console.log("hi");
}
this.say(); // hi
全局变量和window对象的关系
-
使用
var
声明定义的全局变量会被挂载到全局对象window
上。 -
使用
let
、const
声明定义的全局变量不会被挂载到全局对象window
上。
普通函数
普通函数内部的this
指向调用这个函数的对象。
案例1
function testThis(){
console.log(this);
}
testThis(); // 输出结果: window对象
testThis()
在全局作用域中被调用,相当于执行了window.testThis();
,则函数被调用时,内部的this
指向window
.
案例2
var obj = {
test(){
console.log(this);
}
}
obj.test(); // obj
普通函数作为对象上的方法时,
this
指向调用方法的对象.
案例3
var obj = {
test1(){
console.log(this);
},
test2(){
test(); // 这里相当于执行了window.test();
}
}
function test(){
console.log(this);
}
obj.test1(); // obj
obj.test2(); // window
test(); // window
构造函数
构造函数一般是通过new
关键字调用的,其内部的this
指向新创建的对象。
function Person(name,age){
this.name = name;
this.age = age;
console.log(this);
}
const person1 = new Person('张三',20);
const person2 = new Person('李四',18);
构造函数利用指向新对象的
this
,将传入的name
和age
属性直接赋值给新对象。通过最后的console.log(this)
语句也可以检测出this
的指向。
绑定事件函数
const btn = document.querySelector('button');
btn.onclick = function(){
console.log(this);
}
this
指向触发该事件的对象。此处,点击事件触发时,
this
指向按钮这个DOM
对象。
箭头函数
箭头函数没有属于自己的this
。因此,箭头函数内部使用的this
就是箭头函数所在上下文的this
.
var obj = {
test1(){
console.log(this);
},
test2:()=>{
console.log(this);
}
}
obj.test1(); // obj
obj.test2(); // window
test2
是箭头函数,没有属于自己的this
。在其内部输出的this
是obj
所在上下文的this
,即window
。
改变this指向的方法
函数是对象,有属于自己的属性和方法。
函数有call
和apply
方法可以改变调用时this
的指向。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
版权声明:
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com