习题总结(持续更)

var a = 11
if(a < 10)
    console.log('a是一位数')
    console.log('a是小于 10 的数')

此题会打印出:a是小于10的数

因为if语句默认离他最近的那一句为一个整体,进行判断后不会输出:a是一位数。第四句则为单独一个句子,可以这么理解:

var a = 11
if(a < 10)
    console.log('a是一位数')

console.log('a是小于 10 的数')

————————————————————————————————————————————————————————

var a = 1
if(a = 3)
    console.log('a等于3')

此题会打印出:a=3

因为'='是赋值语句,在if的条件语句中a被赋值为3,所以打印出a的值即为3。

如果是下面这种情况:

var a = 1
if(a === 3)
    console.log('a等于3')

'==='以及'=='不同于'=',他们并不是赋值语句,只是判断a的值是否为3,因而在上面代码中,会打印出a=1。

————————————————————————————————————————————————————————

与DOM API相关习题:(补充立即执行函数相关知识)

1、

i. <div id=x></div>             //x的值就是这个id = x的div对应的Element对象。
ii. <div id=parent></div>       //parent的值为:如果有父窗口,就是父窗口,如果没有就是当前窗口。

  两题区别:给id取的名字不一样

  结论:i. parent是一个全局变量,因此不要拿来给id命名(全局变量可耻,不要用)

           ii. 如果想用id = parent,就构造一个函数,在函数内部(局部变量)使用

           iii. 声明了这个函数后,请立即调用它!!!

function(){
    var parent = document.querySelector('#self')
    console.log(parent)
}.call()          //立即调用

           iv. 这个时候执行它控制台会报错,如何解决?

                方法一:可以用括号将这个立即执行函数(匿名函数)包起来:(function(){alert('我是一个匿名函数')})()

               方法二:在这个函数前面加上一个符号(可以是!、-、+、~),告诉浏览器这不是一个声明而是一个立即执行函数。 !function(){alert('我是一个匿名函数')}()

  在这里引出了一个立即执行函数

        概念:立即执行函数就是声明一个匿名函数并且马上调用它。

        作用:创建一个独立的作用域。这个作用域里面的变量,外面访问不到(避免变量污染)。


2、HTMLCollection与NodeList的区别有 答案: AC

         A. HTMLCollection实例对象的成员只能是Element节点,NodeList实例对象的成员可以包含其他节点。

         B. HTMLCollection实例对象都是动态集合,节点的变化会实时反映在集合中。NodeList实例对象都是静态集合。

         C. HTMLCollection实例对象可以用id属性或name属性引用节点元素,NodeList只能使用数字索引引用。


3、

var parent1 = document.getElementById('parent1');
parent1.childNodes.length // 2
parent1.appendChild(document.createElement('div'));
parent1.childNodes.length // 请问现在 length 是多少  答案是3

var allDiv = document.querySelectorAll('div')
allDiv.length // 假设是 2
document.body.appendChild(  document.createElement('div')  )
allDiv.length // 请问现在 length 的值是多少???    答案是2

  第一次的代码重新进行了一次查询,而第二次的代码并没有重新进行查询,如果想让第二次的答案是3,那么把第二次的最后一句代码删去,并加上allDiv = document.querySelectorAll('div');allDiv.length即可。

————————————————————————————————————————————————————————与作用域相关的考题:

拿到代码直接做必然会错!!!先提升声明!!!!!

1、

var a = 1
function f1(){
   alert(a)      //a是多少?
   var a = 2
}
f1.call()

变量提升后的代码如下:

var a = 1
function f1(){
    var a
    alert(a)       //此时a是undefined,先提升声明var a,并没有给a赋值,所以打印出a是undefined
    a = 2
}
f1.call()

2、

var a = 1
function f1(){
    var a = 2
    f2.call()
}
function f2(){
    console.log(a)      //a = ?
}
f1.call()
  在上面这段代码中,全局范围的变量有a、f1、f2,当调用f1后,函数f1中又调用了f2,此时a = 1,因为f2并不是在f1中声明的,f1、f2作为全局变量是平等的,因此a在控制台打印出来就是函数外部声明的a = 1这个值。


3、

var liTags = document.querySelectAll('li')
for (var i = 0;i<liTags.length;i++){
    liTags[i].onclick = function(){
        console.log(i)            //点击第三个li时,打印2还是6
    }
}

  打印6,不论点击的是哪个li,for循环始终要进行,循环完之后的i是6。

补充:如果想打印出0~5,可使用立即执行函数给每个li创造一个独立作用域即可

var liList = ul.getElementsByTagName('li')
for(var i=0; i<6; i++){
  !function(ii){
    liList[ii].onclick = function(){
      alert(ii) // 0、1、2、3、4、5
    }
  }(i)
}

在立即执行函数执行的时候,i 的值被赋值给 ii,此后 ii 的值一直不变。

i 的值从 0 变化到 5,对应 6 个立即执行函数,这 6 个立即执行函数里面的 ii 分别是 0、1、2、3、4、5。





  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值