普通函数与箭头函数的this指向
普通函数的this指向
哪个对象调用的函数,函数的this就指向谁,否则指向全局,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁
如:
一.this的默认指向
例一:
fn()是wendow调用的,其实就等于window,fn(),由于调用这个函数的对象是window,所以this指向window运行结果如下
例二:
第一个function里面的this指向obj,由于第二个函数的调用者是window即window.test(),所以里面的this指向window,故他的结果也是window
例三:
因为当前this指向的为window,所以应该去window对象下面找a, 所以this.a打印出的结果为0
例四:
因为调用foo的对象是obj,所以var that=this中的this指向的是obj,将它赋值给了that,所以that.a就等于obj.a,所以结果就是2.
例五:
例六:
例七:
立即执行函数的this指向window对象,如果要修改立即执行函数里面的this指向,可以通过立即执行函数传参代码如下:
二.this的隐式绑定
三.隐式丢失this指向的5种情况
例一:
结果为0
例二
结果为0
例三
例四
结果为10
例五
例六
例七
结果为:2 2 2
例八
例九
例十
四.New绑定
例一
例二
五.严格模式
在非严格模式中call和apply第一个参数为null/undefined,函数this指向全局对象,在浏览器中是window,在node中是global
在严格模式中(ie 6/7/8/9 除外),传入null/undefined,this不指向全局对象,而是null/undefined本身
箭头函数的this指向
箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this
例一:
function Person(){
this.age = 0;
setTimeout(() => {
this.age++; // this 指向 Person
console.log(this); //指向Person ,且age=1
}, 1000);
}
var p = new Person();
console.log(p); //指向Person ,且 age=0
例二:
var obj = {
say: function () {
setTimeout(() => {
console.log(this)
});
}
}
obj.say(); // obj
例三
var obj = {
say: function () {
var f1 = () => {
console.log(this); // obj
setTimeout(() => {
console.log(this); // obj
})
}
f1();
}
}
obj.say()
例四
var obj = {
say: function () {
var f1 = function () {
console.log(this); // window, f1调用时,没有宿主对象,默认是window
setTimeout(() => {
console.log(this); // window
})
};
f1();
}
}
obj.say()
例五
//1
var x=1;
var obj={
x:2,
say:()=>{
console.log(this); // window
console.log(this.x); // 1
}
}
obj.say();
//2
var a=3;
function test(){
this.a=4;
var fn=()=>{
console.log(this); //test
console.log(this.a) //4
}
fn();
}
var x=new test();
//3
var b=5;
function test2(){
this.b=6;
let func=()=>{
console.log(this); //window
console.log(this.b) //6
}
func();
}
test2();
第一个:ES6中定义的时候绑定this的继承的是父执行上下文里面的this,普通对象(非函数是没有执行上下文的),因此第一个的this指向了window
第二个:this指向new出来的对象,即test
第三个:test2() 没有任何前缀,类似于全局函数,即 window.test2调用,所以此时调用的时候, this指的是window,