字节跳动二面有关于变量提升和this指向的问题
变量提升
//变量提升
console.log(a);// fun a{//2}
var a = 1;
function a() {
//1
}
a = 2;
function a() {
//2
}
console.log(a); // 2
执行结果:
执行顺序相当于:
function a(){
//1
}
function a(){
//2
}
var a;
console.log(a);//function a(){//2}
a=1;
a=2;
console.log(a);//2
this指向
有关箭头函数的this
分析关键:箭头函数的this
取决于其外层函数的this
。若外层没有函数,则指向window
。
// this
var name = "window";
var bar = { name: "bar" };
var foo = {
name: "foo",
say: () => {
console.log(this.name) },
say2: function () {
return () => { console.log(this.name) }
}
}
// 由于箭头函数中的this,取决于外层函数的this,而这里的say()是在对象内部定义的,因此其this应该是window。
foo.say()//window
//由于是箭头函数,其this指向并不会被call、apply、bind方法所影响,因此还是window
foo.say.call(bar);//window
//此处有两层函数包裹,内层是箭头函数,因此内存箭头函数的this指向,取决于外层函数的this,
//而此处是用foo.xxx形式来调用,因此外层函数的this指向的是foo
foo.say2()();//foo
//注意:此处的say2并没有被直接()形式调用,而是通过call进行绑定,而foo.say2这个函数是普通函数,
//只是返回的是一个箭头函数,因此call方法会影响this指向,进而影响到内层箭头函数的this指向
foo.say2.call(bar)();//bar
//foo.say2()已经执行了,反悔了一个箭头函数,因此在此基础上进行call方法调用并不会有用。
foo.say2().call(bar);//foo
执行结果: