博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS 事件循环,闭包,作用域链题
阅读量:6219 次
发布时间:2019-06-21

本文共 1623 字,大约阅读时间需要 5 分钟。

  • 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

转载于:https://juejin.im/post/5c6ec5bce51d4560a7341d8f

你可能感兴趣的文章
Python中Mock和MagicMock的区别
查看>>
Laravel 5.4 入门系列 7. 文章的显示
查看>>
明月的 WordPress 优化思路总结
查看>>
Amazon DynamoDB 入门6:query 和 scan
查看>>
Mac OS X and python “ValueError: unknown locale: UTF-8”
查看>>
理解CSRF跨站请求伪造
查看>>
被误解的MVC和被神化的MVVM
查看>>
DevOps日常:别人家的运维这样过
查看>>
中台之上(一):重视业务架构,不要让“业务的归业务、技术的归技术”
查看>>
通过Visual Studio为Linux编写C++代码
查看>>
利用Apache Spark SQL和DataFrames扩展关系数据库
查看>>
Netflix 混沌工程手册 Part 3:实践方法
查看>>
2018年开源状况:代码贡献超310亿行,而漏洞超16000个
查看>>
Java初学者如何能够把知识深入贯彻
查看>>
仅售99美元!英伟达发布最小AI计算机Jetson Nano
查看>>
写守护进程时, 需要fork两次吗?
查看>>
方面和服务,差别大吗?
查看>>
Go现在接受来自GitHub PR的补丁
查看>>
JetBrains发布WebStorm 2016.2,改进对TypeScript和React的支持
查看>>
国内首例:飞步无人卡车携手中国邮政、德邦投入日常运营
查看>>