- JS的事件循环机制
console.log('one')setTimeout(function () { console.log('two') }, 0)console.log('three')复制代码
输出是
onethreetwo复制代码
此题的关键是JS的事件循环机制,对异步的处理操作,JS有句口令:同步优先、异步靠边、回调垫底。
第一个console.log是同步执行,直接输出one
执行完遇到setTimeout回调(垫底执行),把setTimeout丢到回调消息队列等待
然后console.log('three')也是同步执行,直接输出three,同步的消息队列全部执行完后轮到回调队列执行输出two
- 闭包与作用域相关题目
function test() { var n = 4399; function add() { n++; console.log(n); } return { n: n, add: add }}var result = test(); var result2 = test(); result.add();result.add(); console.log(result.n); result2.add(); 复制代码
输出
4400440143994400复制代码
此题的关键在于明白var result = test() 与var result2 = test()此处分别产生了两个闭包,它们之间是独立,互不干扰的
闭包的产生:在A函数中定义了B函数,B函数中引用了A函数中的变量,此时会产生闭包
var result = test() // 设置result的属性为: { n:4399, add: add() }var result2 = test() // 设置result2的属性为: { n:4399, add: add() }result.add() // 调用了result的add方法,执行n++,所以n = 4399 + 1 输出4400result.add() // 再次调用了result的add方法,此时n = 4400 所以n = 4400 + 1 输出4401console.log(result.n) //这是输出result的属性n值,输出4399,这里是输出对象属性返回值,并无调用闭包result2.add() // 调用了result2的add方法,此时n = 4399 所以n = 4399 + 1 输出4400复制代码
- 作用域链的题目
var myObject = { foo: "bar", func: function() { var self = this; console.log(this.foo); console.log(self.foo); (function() { console.log(this.foo); console.log(self.foo); }()); }};myObject.func();复制代码
输出
barbarundefinedbar复制代码
此题关键理解: 方法或函数由谁调用,方法函数内部的this就指向谁
1、func由myObject调用,this指向myObject,输出bar
2、self 指向myObject,输出bar
3、立即执行匿名函数表达式由window调用,this指向window
4、立即执行执行函数在本作用域找不到self,沿着作用域链向上寻找self变量,找到了父函数中指向myObject对象的self