定时器&DOM(节点和选取API)

1、下面这段代码输出结果是? 为什么?

var a = 1;
setTimeout(function(){
    a = 2;
    console.log(a);  //2
}, 0);
var a ;
console.log(a);  //1
a = 3;
console.log(a);  //3
// 1
// 3
// 2
setTimeout会被立刻放在任务队列,等待stack任务的完成,再来执行,
又由变量赋值知结果为1,3,2

2、下面这段代码输出结果是? 为什么?

var flag = true;
setTimeout(function(){
    flag = false;
},0)
while(flag){}
console.log(flag);
//结果是无限循环
因为setTimeout会被放在任务队列中,然后执行while,因为flag= true,
所以一直执行while(t){},不会执行console.log(flag)

3、实现一个节流函数

function throttle(fn, delay) {
    var timer = null
    return function(){
        clearTimeout(timer)
        timer = setTimeout(function(){ 
            fn(arguments)
        }, delay)
    }
}

4. 简单解释单线程、任务队列的概念

  • 单线程

    • 单线程模型指的是,JavaScript只在一个线程上运行。也就是说,JavaScript同时只能执行一个任务,其他任务都必须在后面排队等待。
    • JavaScript只在一个线程上运行,不代表JavaScript引擎只有一个线程。事实上,JavaScript引擎有多个线程,单个脚本只能在一个线程上运行,其他线程都是在后台配合。
  • 任务队列

    • 里面是各种需要当前程序处理的消息。新的消息进入队列的时候,会自动排在队列的尾端。
    • 运行线程只要发现消息队列不为空,就会取出排在第一位的那个消息,执行它对应的回调函数。等到执行完,再取出排在第二位的消息,不断循环,直到消息队列变空为止。
    • 另一种情况是setTimeout会在指定时间向消息队列添加一条消息。如果消息队列之中,此时没有其他消息,这条消息会立即得到处理;否则,这条消息会不得不等到其他消息处理完,才会得到处理。因此,setTimeout指定的执行时间,只是一个最早可能发生的时间,并不能保证一定会在那个时间发生。

5、列出DOM 元素选取的 API

getElementById()  //获取id
getElementsByClassName()  //获取class类名
getElementsByTagName()  //获取标签名
getElementsByName()  //获取有name属性的html元素
querySelector()  //选择器
querySelectorAll()  //选择所有选择器

6、如果创建元素、如何添加元素

创建元素
createElement()  //元素节点
createTextNode()  //文本节点
createDocumentFragment()
例如:
var li = document.createElement("li")
var content = document.createTextNode("我是li元素")
var a = document.createElement("a")
var con = document.createTextNode("我是链接")
添加元素
appendChild()  //添加元素
insertBefore()  //某个元素之前插入元素
replaceChild()  //要插入的元素和要替换的元素
例如:
var li = document.createElement("li")
var content = document.createTextNode("我是li元素")
var a = document.createElement("a")
var con = document.createTextNode("我是链接")
li.appendChild(content)
a.appendChild(con)
li.appendChild(a)

你可能感兴趣的:(定时器&DOM(节点和选取API))