提到做用域,有一句话你们(有js开发经验者)可能比较熟悉:“javascript没有块级做用域”。所谓“块”,就是大括号“{}”中间的语句。例如if语句:javascript
再好比for语句:html
因此,咱们在编写代码的时候,不要在“块”里面声明变量,要在代码的一开始就声明好了。以免发生歧义。如:前端
其实,你光知道“javascript没有块级做用域”是彻底不够的,你须要知道的是——javascript除了全局做用域以外,只有函数能够建立的做用域。java
因此,咱们在声明变量时,全局代码要在代码前端声明,函数中要在函数体一开始就声明好。除了这两个地方,其余地方都不要出现变量声明。并且建议用“单var”形式。jquery
jQuery就是一个很好的示例:web
下面继续说做用域。做用域是一个很抽象的概念,相似于一个“地盘”面试
如上图,全局代码和fn、bar两个函数都会造成一个做用域。并且,做用域有上下级的关系,上下级关系的肯定就看函数是在哪一个做用域下建立的。例如,fn做用域下建立了bar函数,那么“fn做用域”就是“bar做用域”的上级。json
做用域最大的用处就是隔离变量,不一样做用域下同名变量不会有冲突。例如以上代码中,三个做用域下都声明了“a”这个变量,可是他们不会有冲突。各自的做用域下,用各自的“a”。闭包
说到这里,我们又能够拿出jquery源码来说讲了。app
jQuery源码的最外层是一个自动执行的匿名函数:
为何要这样作呢?
缘由就是在jQuery源码中,声明了大量的变量,这些变量将经过一个函数被限制在一个独立的做用域中,而不会与全局做用域或者其余函数做用域的同名变量产生冲突。
全世界的开发者都在用jQuery,若是不这样作,极可能致使jQuery源码中的变量与外部javascript代码中的变量重名,从而产生冲突。
做用域这块只是很很差解释,我们就小步快跑,一步一步慢慢展现给你们。
下一节将把做用域和执行上下文环境结合起来讲一说。
可见,要理解闭包,不是一两句话能说清楚的。。。
---------------------------------------------------------------------------
本文已更新到《深刻理解javascript原型和闭包系列》的目录,更多内容可参见《深刻理解javascript原型和闭包系列》。
另外,欢迎关注个人微博。
学习做者教程:《前端JS高级面试》《前端JS基础面试题》《React.js模拟大众点评webapp》《zepto设计与源码分析》《json2.js源码解读》