this什么时候指向谁,刚学习的时候很容易蒙圈,总结记录一下,希望对大家有所帮助,有写的不对的地方也欢迎指正。
1.函数预编译过程 this 指向 window
2.全局作用域里 this 指向 window
2.call / apply 可以改变函数运行时 this 指向
4.obj.func(); func()里面的 this 指向obj
5.new func() , func()里面的this指向函数本身
使用几个面试题详细说明:
题1,求打印结果:
var foo = 123;
function print(){
this.foo = 234;
console.log(foo);
}
print();
打印出 234,第三行this.foo = 234 中的this指的是window, 将全局中foo的值改为234,
第四行执行时,当前局部上下文中找不到foo这个变量,于是向上往全局找,找到全局的foo, 输出234;
题2,求打印结果:
var name = 222;
var a = {
name:111,
say(){
console.log(this.name)
}
}
var fun = a.say;
fun(); //222 全局的name
a.say() //111 局部的name
var b = {
name:333,
say(fun){
fun();
}
}
b.say(a.say);//222
b.say = a.say;
b.say();//333
输出的四个结果分别为 222 111 222 333
第一个:fun接受了a.say的方法体,在全局下自己调用,因此this指向window,name输出的是全局的222
第二个:a.say() 执行,a里面的this是a ,因此name输出的是111
第三个:a.say的函数体当做参数放到b.say里,此时b里的this是b没错,但是注意fun()的执行无人调用,只是在b.say这个环境里执行了,所以函数体里的this还是指向window,输出222,需要慢慢捋一捋
第四个:a.say的方法体赋值给b.say, b调用say方法,this指向的是b,因此输出333
题3,求打印结果:
var foo =123;
function print(){
//这里会自动创建this变量
//var this = Object.create(print.prototype)
this.foo = 234;
console.log(foo);
}
new print();
new以后,系统会默认在print里创建一个this对象,this由原来的window改为一个空对象了,所以this.foo= 234 改变的就是this对象中的foo而不是全局的foo了,因此最后输出123
题4,以下代码,求test()和new test()的结果:
1 var a = 5;
2 function test () {
3 a = 0;
4 console.log(a);
5 console.log(this.a);
6 var a ;
7 console.log(a)
8 }
答案 :test() --> 0 5 0
new test() -->0 undefied 0
首先说test(),考的就是预编译和this了,预编译想了解更多看点这里
第4行中,输出的是局部函数上下文中的a,值为0 ;
第5行中,由于此时this指向的是window,所以输出5;
第7行中,输出的仍然是局部函数上下文中的a,值为0
再来说new test(),new test() 时 test函数中系统会加上一句定义 this =Object.create(test.prototype),此时的this变成了一个空对象,在第5行中,打印this.a必然是没有的;
而在第4行和第7行,打印结果不变,他们还是输出局部上下文中a的值