this 深度面试题3

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

但是使用箭头函数可以改善

上一篇:Java常用的转义字符


下一篇:JavaScript面向对象OOM 2(JavaScript 创建对象的工厂模式和构造函数模式)