很杂的练习题

60 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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()