var a = 10;
function foo() {
console.log(a); // ??
var a = 20;
}
foo();
var a = 10;
function foo() {
var a ;
console.log(a); // ??
a = 20;
}
foo();
则输出undefined。
问题2:如果我们使用 let 或 const 代替 var,输出是否相同var a = 10;
function foo() {
console.log(a); // ??
let a = 20;
}
foo();
var a = 10; // 全局使用域
function foo() {
// 死区 TDZ 开始
// 创建了未初始化的'a'
console.log(a); // ReferenceError
// 死区TDZ结束,'a'仅在此处初始化,值为20
let a = 20;
}
注意:不要觉得let不能变量提升,就可以访问全局作用域中的变量a。 只要访问上面的TDZ中的变量就会发生错误。
问题3:"newArray"中有哪些元素?var array = [];
for(var i = 0; i <3; i++) {
array.push(() => i);
}
var newArray = array.map(el => el());
console.log(newArray); // ??
解析:
本题考查闭包。在for循环中每一次push一个方法,for循环完成之后,push了三个方法。此时i已经是3。在使用map方法对每一项进行调用,并且返回,而i已经是3。所以返回[3,3,3]
箭头函数不好看,可以将上面的代码写成:
var array = [];
for(var i = 0; i <3; i++) {
array.push(function() {return i});
}
var newArray = array.map(function(item){
return item();
});
console.log(newArray); // ??
如果想输出[0,1,2]该如何改?
方法1:将var改为let
var array = [];
for(let i = 0; i <3; i++) {
array.push(() => i);
}
var newArray = array.map(el => el());
console.log(newArray); // ??
var array = [];
for(let i = 0; i <3; i++) {
array = (function(i) {
return function() {
return i;
}
}(i))
}
var newArray = array.map(el => el());
console.log(newArray); // ??
function foo() {
setTimeout(foo, 0); // 是否存在堆栈溢出错误?
};
foo();
解析:
本题考查js运行过程。
一张图解释:
function foo() {
return Promise.resolve().then(foo);
};
var obj = { x: 1, y: 2, z: 3 };
[...obj]; // TypeError
var obj = { x: 1, y: 2, z: 3 };
obj[Symbol.iterator] = function() {
// iterator是一个具有next方法的对象,它的返回至少有一个对象,两个属性:value & done
return {
next: function() {
if (this.count === 3) {
// 设置done为true,表示不能再遍历
return { value: this.count, done: true };
}
this.count = this.count + 1;
return {value: this.count, done: false};
},
count: 0
};
};
console.log([...obj]); // [1, 2, 3]
var obj = { x: 1, y: 2, z: 3 };
obj[Symbol.iterator] = function*() {
yield 1;
yield 2;
yield 3;
}
console.log([...obj]); // [1, 2, 3]
}
var obj = { a: 1, b: 2 };
Object.setPrototypeOf(obj, {c: 3});
Object.defineProperty(obj, 'd', { value: 4, enumerable: false });
// what properties will be printed when we run the for-in loop?
for(let prop in obj) {
console.log(prop);
}
var x = 10;
var foo = {
x: 90,
getX: function() {
return this.x;
}
};
foo.getX(); // prints 90
var xGetter = foo.getX;
xGetter(); // prints ??
解析:
本题考查this指向。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |