箭头函数不会与this进行绑定,其this指向取决于该箭头函数同级作用域的this指向,又由于对象不能形成自己的作用域,因此其作用域为全局作用域,this指向Window对象

发布时间 2023-11-16 14:43:10作者: 龙陌

执行下列选项的程序,输出结果不是Window对象的是()

A

setTimeout(function(){
  console.log(this);
},1000);

B

function Star(){
  console.log(this);
}

new Star();

C

var o = {
  sayHi:()=>{
    console.log(this);
  }
}
o.sayHi();

D
(function(){

console.log(this);

}());

正确答案:B

在setTimeout()定时器中,this指向Window对象,A选项不符合题意;
通过new Star()来调用Star函数,由于使用new绑定,Star函数内部的this指向new创建的实例,而非Window对象,B选项符合题意;
箭头函数不会与this进行绑定,其this指向取决于该箭头函数同级作用域的this指向,又由于对象不能形成自己的作用域,因此其作用域为全局作用域,this指向Window对象,C选项不符合题意;
D选项,立即执行函数的this指向Window对象,D选项不符合题意。

this的四种绑定形式

(1.默认绑定 2.隐式绑定 3.显式绑定 4.new绑定)
A. 默认绑定,指向window
B. new绑定,指向new创建的对象
C. 以为是隐式绑定指向o?用了箭头函数哦,所以还是window
D. 默认绑定,指向window

不懂this绑定的看下文,或者一句话总结:谁调用this,this指向谁

fn() 光秃秃的,默认绑定,指向this,无论在哪里调用都是
实际上是window.fn() window调用,指向window
obj.fn() 隐式绑定,指向obj,obj在调用
call()、apply()、bind 显式绑定,要指向谁就写在()里面
new fn() new绑定,指向new创建的对象

默认绑定

只要是 fn() 这种孤单单的函数执行的 this都是默认绑定,指向window,无论这个fn()在哪里,被嵌套多少层都是指向window
A.定时器1秒后 执行函数 function(){...} 就是fn()形式,默认绑定指向window
同理D也是

主要问题就是C:不细看以为是指向o,但这里用了箭头函数,箭头函数没有自己的this,会去找外层的this当做自己的this,因此还是指向window。

new绑定

new一个对象所作的四件事情
新建一个对象
把this的指向指向这个对象
执行构造函数内的代码
返回这个新对象

箭头函数不是找上一层作用域,是找最近 包住箭头函数 的 普通的函数function{} 的this作为自己的this,如果上一层是箭头函数,也会去上上一层找,甚至上上上一层,直到找到全局对象window。

箭头的函数没有自己的this,this是靠包住 箭头函数的普通函数给的, 1.找普通函数 2.这个普通函数要包住箭头函数
你这个箭头函数都没有普通函数包着一直顺着作用域找到window,this指向是window

new创建的对象 新建一个对象 把this指向这个对象 执行构造函数内的代码 返回新的对象
使用箭头函数绑定的时候,this是静态绑定的。