提到作用域,有一句话大家(有js开发经验者)可能比较熟悉:“javascript没有块级作用域”。所谓“块”,就是大括号“{}”中间的语句。例如if语句:

var i = 10;
if(i > 1){var name = 'username';
}
console.log(name); //username

再比如for语句:

for(var i = 0; i < 10; i++){// .....
}
console.log(i); //10

所以,我们在编写代码的时候,不要在“块”里面声明变量,要在代码的一开始就声明好了。以避免发生歧义。如:

var i;
for(i = 0; i < 10; i++){//.......
}
console.log(i); //10

其实,你光知道“javascript没有块级作用域”是完全不够的,你需要知道的是——javascript除了全局作用域之外,只有函数可以创建的作用域。
所以,我们在声明变量时,全局代码要在代码前端声明,函数中要在函数体一开始就声明好。除了这两个地方,其他地方都不要出现变量声明。而且建议用“单var”形式。

jQuery就是一个很好的示例:

下面继续说作用域。作用域是一个很抽象的概念,类似于一个“地盘”

如上图,全局代码和fn、bar两个函数都会形成一个作用域。而且,作用域有上下级的关系,上下级关系的确定就看函数是在哪个作用域下创建的。例如,fn作用域下创建了bar函数,那么“fn作用域”就是“bar作用域”的上级。
作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。例如以上代码中,三个作用域下都声明了“a”这个变量,但是他们不会有冲突。各自的作用域下,用各自的“a”。
说到这里,咱们又可以拿出jquery源码来讲讲了。
jQuery源码的最外层是一个自动执行的匿名函数:

(function(window, undefined){var a;var b;var c;// ······
}(window));

为什么要这样做呢?
原因就是在jQuery源码中,声明了大量的变量,这些变量将通过一个函数被限制在一个独立的作用域中,而不会与全局作用域或者其他函数作用域的同名变量产生冲突。
全世界的开发者都在用jQuery,如果不这样做,很可能导致jQuery源码中的变量与外部javascript代码中的变量重名,从而产生冲突。
作用域这块只是很不好解释,咱们就小步快跑,一步一步慢慢展示给大家。
下一节将把作用域和执行上下文环境结合起来说一说。
可见,要理解闭包,不是一两句话能说清楚的。。。

深入理解javascript原型和闭包(12)——简介【作用域】相关推荐

  1. 深入理解javascript原型和闭包(16)——完结

    之前一共用15篇文章,把javascript的原型和闭包. 首先,javascript本来就"不容易学".不是说它有多难,而是学习它的人,往往都是在学会了其他语言之后,又学java ...

  2. 深入理解javascript原型和闭包(17)——补this

    本文对<深入理解javascript原型和闭包(10)--this>一篇进行补充,原文链接:http://www.cnblogs.com/wangfupeng1988/p/3988422. ...

  3. 深入理解javascript原型和闭包(3)——prototype原型

    既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

  4. 深入理解javascript原型和闭包(2)——函数和对象的关系

    上文(理解javascript原型和作用域系列(1)--一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...

  5. 深入理解javascript原型和闭包

    原文链接http://www.cnblogs.com/wangfupeng1988/p/3977924.html 对象是属性的集合. function show(x) {console.log(typ ...

  6. 深入理解JavaScript原型与闭包

    说明 本文为作者学习记录相关笔记及理解,如有不妥之处,请各位读者积极指出, 虽然标题是深入理解,但可能存在许多不够深入的地方,请各位小伙伴不吝赐教 一切都是对象 一切引用类型都是对象,对象是属性的集合 ...

  7. 深入理解javascript原型和闭包(6)——继承

    为何用"继承"为标题,而不用"原型链"? 原型链如果解释清楚了很容易理解,不会与常用的java/C#产生混淆.而"继承"确实常用面向对象语言 ...

  8. 深入理解javascript原型和闭包(15)——闭包

    前面提到的上下文环境和作用域的知识,除了了解这些知识之外,还是理解闭包的基础. 至于"闭包"这个词的概念的文字描述,确实不好解释,我看过很多遍,但是现在还是记不住. 但是你只需要知 ...

  9. 深入理解javascript原型和闭包(7)——原型的灵活性

    在Java和C#中,你可以简单的理解class是一个模子,对象就是被这个模子压出来的一批一批月饼(中秋节刚过完).压个啥样,就得是个啥样,不能随便动,动一动就坏了. 而在javascript中,就没有 ...

最新文章

  1. 径向基函数神经网络_基于RBF神经网络的网络安全态势感知预测研究
  2. CLH锁 、MCS锁
  3. python列表的索引算法_Python-确定列表是否对称的算法
  4. 关于初始化C++类成员
  5. Linux02进程内存管理
  6. Spring 事务 以及拦截器的前后关系实验 Mybatis 日志拦截
  7. 一棵树的生物量怎么算_宾利的眼镜盒价值2万,算坑人吗?网友:良心产品,不坑穷人...
  8. es6 箭头函数 rest参数 扩展运算符
  9. 最全原理图元器件查询
  10. 【delete用法 与 object(对象)的创建】
  11. 近日总结3.17-3.19(windows server)
  12. 河钢唐钢微尔云计算中心对外签订首个合同
  13. flea-db使用之基于对象池的FleaJPAQuery
  14. 观海智能观海舆情大数据SaaS云平台
  15. java方法的通用格式,【学习笔记】使用Java读取、写入Excel全版本(包含xls、xslx格式)通用方法及代码展示(POI)...
  16. 大华SDK+JAVA+4g网络摄像头进行二次开发
  17. 支付宝又要刷屏了,红包活动开始了
  18. 时钟芯片 服务器,通用实时时钟芯片
  19. Python 83道经典练习题,含答案!
  20. npm删除项目所有依赖和清缓存清缓存的办法

热门文章

  1. 程序员面试时这样介绍自己的项目经验,成功率能达到98.99%
  2. Linux的secureCRT设置字体大小
  3. mysql行转列sql函数_sql动态行转列的两种方法
  4. python语言程序设计实践教程答案实验六_20192417 实验一《Python程序设计》实验报告...
  5. 流水调度问题c语言,基于遗传算法的流水车间调度问题汇总.doc
  6. PHP大文件上传问题
  7. php加密登录_PHP写一个简单的网页加密认证
  8. controller怎么调用controller_SpringMVC五大核心组件及调用过程
  9. ai去除水印_ai全自动视频剪辑软件,每天批量制作800条原创视频!
  10. 【uni-app】swiper 实现纵向轮播,且支持鼠标滚轮滚动翻页