携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情
别骂我球球了,直接copy的原先写的文章。
1.以下代码执行的结果
for(var i=0;i<3;++i){
setTimeout(function(){
console.log(i);
},100);
}
0,1,2 1,2,3 3,3,3 0,0,0 解析:每次for循环的时候setTimeout都会执行,因为setTimeout是异步函数,里面的function则不会立即执行,而是会被放入任务队列,因此放了3次;for循环的3次执行完之后,,i变为3,也就是每次循环,i都会被后一个i值覆盖,然后全部执行任务队列中的函数,所以就是输出3个3。
2.以下代码执行后,console 输出的信息是?
1
2
3
for(let i = 0; i < 5; i++){
requestAnimationFrame(() => console.log(i));
}
1 2 3 4 5 0 1 2 3 4 4 4 4 4 4 5 5 5 5 5 解析:requestAnimationFrame虽然是异步函数,但是由于i是用let定义的,每一次都会生成一个块级作用域,来把当前值和requestAnimationFrame放在这个作用域中 选A
3.执行以下代码,其实现的效果为()
鼠标单击button1后将button1链接到button2的后面 鼠标单击button1后将button1移动到button2的后面 鼠标单击button1后将button2移动到button1的后面 鼠标单击button1后将button2链接到button1的后面 解析:只有我们清楚appendChild() 方法可向节点的子节点列表的末尾添加新的子节点即可。
4.执行以下程序,输出结果为()
var a = 2;
function fn(){
b();
return ;
var a = 1;
function b(){
console.log(a);
}
}
fn();
1 2 undefined
抛出异常
解析:函数解析优先变量解析:所以提升就是声明(变量/函数)提至当前作用域的最顶部,赋值语句留在原地,代码如下
//原来的代码 var a = 2; function fn(){ b(); return ; var a = 1; function b(){ console.log(a); } } fn();
//实际上的代码 var a = 2; function fn(){ function b(){ console.log(a); } var a //变量声明提升,默认赋值为undefined b(); //执行函数b,在当前作用域找到a,值为undefined return;//return后面的语句不再执行,a没有被赋值为1 a = 1; //在原来的位置才会赋值,但不会执行到这里 } fn();
5.依据以下JS代码,在位置A打印变量a与在位置B打印变量a各会有怎样的输出?
var a = 1;
function test(){
// 位置A
class a {}
// 位置B
}
test();
1、class a {} 报错、class a {} 报错、报错 1、报错 解析:class和let一样都有暂时性死区,在被声明前无法访问
也就是在当前作用域能找到,但是要在声明后才能访问 es6中的class和let const一样都不存在提升 (实际存在提升,只是因为TDZ的作用,并不会像var那样得到undefined,而是直接抛出错误)
原来的代码 var a = 1; function test(){ //console.log(a) 位置A class a {} // console.log(a) 位置B } test();
实际上提升后的 var a = 1; function test(){ console.log(a) 位置A //在test()作用域内找得到a //是一个class但是存在TDZ暂时性死区,访问报错 class a {} console.log(a) 位置B //a已经声明创建出来了 } test()