博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript闭包理解
阅读量:6700 次
发布时间:2019-06-25

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

下面来自知乎的回答:

作者:大水
链接:https://www.zhihu.com/question/34547104/answer/59515735

近似正确的短答案:闭包就是一个函数把外部的那些不属于自己的对象也包含(闭合)进来了。

短答案:JavaScript中的闭包,无非就是变量解析的过程

首先看一段话:

每次定义一个函数,都会产生一个作用域链(scope chain)。当JavaScript寻找变量varible时(这个过程称为变量解析),总会优先在当前作用域链的第一个对象中查找属性varible ,如果找到,则直接使用这个属性;否则,继续查找下一个对象的是否存在这个属性;这个过程会持续直至找到这个属性或者最终未找到引发错误为止

看个简单版的例子:

(function(){    var hello="hello,world"; function welcome(hi){ alert(hi); //解析到作用域链的第一个对象的属性 alert(hello); //解析到作用域链的第二个对象的属性 } welcome("It's easy"); })();
运行结果很简单,一个弹窗It's easy.一个弹窗hello,world。
分析过程如下:
对于函数welcome(),定义welcome的时候会产生一个作用域链对象,为了表示方便,记作scopechain。scopechain是个有顺序的集合对象。
  • scopechain的第一个对象:为了方便表示记作sc1, sc1有若干属性,引用本函数的参数和局部变量,如sc1.hi ;
  • scopechain的第二个对象:为了方便表示记作sc2,sc2有若干属性,引用外层函数的参数和局部变量,如sc2.hello;
  • ...
  • scopechain的最后一个对象:为了方便表示记作scn,scn引用的全局的执行环境对象,也就是window对象!,如scn.eval();

这里之所以可以弹出hello,world,原因就是变量解析时在welcome函数作用域链的第一个对象上找不到hello属性,然后就去第二个对象上找去了(结果还真找到了)。

所以,JavaScript中的所谓的高大上的
闭包其实很简单,根本上还是变量解析。而之所以可以实现,还是因为变量解析会在作用域链中依次寻找对应属性的导致的。

转载于:https://www.cnblogs.com/zhangmingzhao/p/7353831.html

你可能感兴趣的文章
实验四
查看>>
OCM_第十九天课程:Section9 —》Data Guard _ DATA GUARD 原理/DATA GUARD 应用/DATA GUARD 搭建...
查看>>
删除一年之前的日志文件
查看>>
IoC容器Autofac(3) - 理解Autofac原理,我实现的部分Autofac功能(附源码)
查看>>
html字符串生成器源代码
查看>>
Crusher Django 学习笔记4 使用Model
查看>>
Sublime Text 3 快捷键汇总
查看>>
优化android studio编译的apk大小
查看>>
论证是一门学问
查看>>
Bad Request (Invalid Hostname)解决方法
查看>>
indy10 UDP实例
查看>>
POJ1274 The Perfect Stall(二分图)
查看>>
记录的习惯
查看>>
shell MAC 地址 校验
查看>>
函数式C代码
查看>>
一个10年SEO工作者的35个SEO经验
查看>>
待整理
查看>>
2016-8-2更新日志
查看>>
【Project3】技术总结
查看>>
mysql my.cnf 配置建议
查看>>