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)
网友评论