let a = 0;
const obj = {
a:1,
b:function(){
console.log(this.a)
}
}
const obj1 = {a:2}
const fun = obj.b
fun()
fun.apply(obj)
fun.bind(obj1).apply(obj)
const fun1 = fun.bind(obj1)
new fun()
解答:
这道题的答案是 undefined,1,2。
我一开始拿到这道题的时候,感觉应该是0,1,2,一看答案,还是没有弄懂。
第一个undefined,让我陷入了思考。
在我印象里,fun()里的this肯定指向的是window,那么,a已经在window里啊,为啥不打印0
后来想起来,let和const声明的值,不绑定全局作用域。
至于为什么说let和const的值不绑定全局作用域呢,
let 和const 声明的时候,也会先出现变量提升,不过提升不是提升到Global的全局的变量对象里,而是在当前的代码段的作用域的Script里。而我们经常说的全局变量,是Global对象。let和const提升了之后,就开始出现暂时性死区。直到该变量的let或者const声明的出现。
至于fun.bind(obj1).apply(obj)打印2的为他
bind函数:在使用 bind() 了之后,会创建一个新的函数。而这个新函数的this,永远指向bind的第一个参数,不管以后调用多少次,this都指向bind的第一个参数。