JavaScript睡前练习题第二弹来咯

阅读: 评论:0

JavaScript睡前练习题第二弹来咯

JavaScript睡前练习题第二弹来咯

1.以下代码执行的结果

1

2

3

4

5

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.执行以下代码,其实现的效果为()

1

2

3

4

5

6

7

8

9

10

11

12

<div>

   <input type="button" id ="button1" value="1" onclick="moveBtn(this);">

   <input type="button" id ="button2" value="2" />

</div>

<script type="text/javascript">

   function moveBtn(obj) {

     var clone = obj.cloneNode(true);

     var parent = obj.parentNode;

     parent.appendChild(clone);

     

   }

</script>

鼠标单击button1后将button1链接到button2的后面
鼠标单击button1后将button1移动到button2的后面
鼠标单击button1后将button2移动到button1的后面
鼠标单击button1后将button2链接到button1的后面

解析:只有我们清楚appendChild() 方法可向节点的子节点列表的末尾添加新的子节点即可。

4.执行以下程序,输出结果为()

1

2

3

4

5

6

7

8

9

10

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 //变量声明提升,默认赋值为undefinedb(); //执行函数b,在当前作用域找到a,值为undefinedreturn;//return后面的语句不再执行,a没有被赋值为1a = 1; //在原来的位置才会赋值,但不会执行到这里
}
fn();

5.依据以下JS代码,在位置A打印变量a与在位置B打印变量a各会有怎样的输出?

1

2

3

4

5

6

7

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()

本文发布于:2024-02-04 07:27:42,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170702027853548.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23