window.val = 1; var obj = { val: 2, dbl: function () { this.val *= 2; val *= 2; console.log(val); console.log(this.val); } }; // 说出下面的输出结果 obj.dbl(); var func = obj.dbl; func(); 结果是: 2 4 8 8
val变量在没有指定对象前缀,默认从函数中找,找不到则从window中找全局变量
即 val *=2 就是 window.val *= 2
this.val默认指的是 obj.val ;因为 dbl()第一次被obj直接调用
<2>14行代码调用
func() 没有任何前缀,类似于全局函数,即 window.func调用,所以
第二次调用的时候, this指的是window, val指的是window.val
第二次的结果受第一次的影响
var obj = {
say: function () {
return function() {
console.log(this)
}
}
}
obj.say()(); // window
var obj = {
say: function () {
return ()=> {
console.log(this)
}
}
}
obj.say()(); // obj
匿名函数由于没有默认的宿主对象,所以默认this指向window 箭头函数改善
<script> var obj = { say: function () { setTimeout(() => { console.log(this) }); } } obj.say(); // obj </script> 此时的 this继承自obj, 指的是定义它的对象obj, 而不是 window!
定时器中的函数,由于没有默认的宿主对象,所以默认this指向window
但是使用箭头函数可以改善