一、this指向函数的调用者,全局上下文默认this指向window, 严格模式下指向undefined。
1、普通函数 this指向window
function fn(){}
调用:
fn(); fn.call();
2、对象的方法 this指向对象obj
var obj = {
show:function(){}
}
调用:
obj.show();
3、构造函数 this指向fn这个实例对象
function Star(){}
调用:
var fn = new Star();
4、绑定事件函数 this指向函数的调用者,btn按钮对象
var btn = document.querySelector("button");
调用:
btn.onclick = function(){}
5、定时器函数 this指向的是window
6、立即执行函数 this指向的是window
7、箭头函数()=>{}
箭头函数自身是没有this的,会自动绑定外层this
二、可以改变this指向的方法bind()、call()、apply() ,及对比
bind()
第一个参数:this新指向
后面的参数:作为实参传给了新函数
bind()的执行结果:改变this指向新函数,只绑定,需要手动执行
call()
第一个参数:this新指向
后面的参数:作为实参传给了新函数
call()的执行结果:改变this指向新函数,并自动执行
apply()
第一个参数:this新指向
后面的参数:必须是数组,被自动解析之后,每个数据作为实参传给了新函数(覆盖新函数的arguments)
apply()的执行结果:改变this指向新函数,并自动执行
var obj = {
name:"admin",
show:function(a,b){
console.log("这是:" + this.name);
console.log(a,b);
}
}
var obj2 = {
name:"root"
}
obj.show("hello","world");
obj.show.bind(obj2,"hi","js")(); //自行不执行,需要添加小括号执行
obj.show.call(obj2,"yes","css");
obj.show.apply(obj2,["oh","html"]); //除一个参数,其他需要是数组
简单小结,若有疑问,欢迎留言~~