以下代码会输出什么?
const x = 1;
const obj = {
x: 3,
fun: function () {
const x = 5;
return this.x;
},
};
const fun = obj.fun;
console.log(fun(), obj.fun());
答案: undefined 3
解析:
(1)普通函数中的this是在调用的时候确定,谁调用 this就指向谁。普通函数中的定时器this指向window;
ps:箭头函数的this则是在声明的时候就已经确定,而且不会改变this是继承自父级执行上下文的this。
(2)fun指向obj对象中定义的fun函数,fun()的this指向全局对象window,但由于x是使用const声明的,const声明的变量不会挂载到window上(let也不会,var会),因此输出undefined;
附:读《全局作用域中,用const和let声明的变量去哪了?》
(3)obj.fun()的fun函数中,this指向obj对象,因此输出3。
那么,什么时候会输出5?
const x = 1;
const obj = {
x: 3,
fun: function () {
const x = 5;
// return this.x;
return x;
},
};
const fun = obj.fun;
console.log(fun(), obj.fun());
输出:5 5
let和const不是不能重复声明吗?为什么再次声明不会报错?
答:对于let和const,内层作用域可以定义外层作用域的同名变量。