深入理解javascript原型和闭包(12)——简介【作用域】
提到作用域,有一句话大家(有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)——简介【作用域】相关推荐
- 深入理解javascript原型和闭包(16)——完结
之前一共用15篇文章,把javascript的原型和闭包. 首先,javascript本来就"不容易学".不是说它有多难,而是学习它的人,往往都是在学会了其他语言之后,又学java ...
- 深入理解javascript原型和闭包(17)——补this
本文对<深入理解javascript原型和闭包(10)--this>一篇进行补充,原文链接:http://www.cnblogs.com/wangfupeng1988/p/3988422. ...
- 深入理解javascript原型和闭包(3)——prototype原型
既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...
- 深入理解javascript原型和闭包(2)——函数和对象的关系
上文(理解javascript原型和作用域系列(1)--一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...
- 深入理解javascript原型和闭包
原文链接http://www.cnblogs.com/wangfupeng1988/p/3977924.html 对象是属性的集合. function show(x) {console.log(typ ...
- 深入理解JavaScript原型与闭包
说明 本文为作者学习记录相关笔记及理解,如有不妥之处,请各位读者积极指出, 虽然标题是深入理解,但可能存在许多不够深入的地方,请各位小伙伴不吝赐教 一切都是对象 一切引用类型都是对象,对象是属性的集合 ...
- 深入理解javascript原型和闭包(6)——继承
为何用"继承"为标题,而不用"原型链"? 原型链如果解释清楚了很容易理解,不会与常用的java/C#产生混淆.而"继承"确实常用面向对象语言 ...
- 深入理解javascript原型和闭包(15)——闭包
前面提到的上下文环境和作用域的知识,除了了解这些知识之外,还是理解闭包的基础. 至于"闭包"这个词的概念的文字描述,确实不好解释,我看过很多遍,但是现在还是记不住. 但是你只需要知 ...
- 深入理解javascript原型和闭包(7)——原型的灵活性
在Java和C#中,你可以简单的理解class是一个模子,对象就是被这个模子压出来的一批一批月饼(中秋节刚过完).压个啥样,就得是个啥样,不能随便动,动一动就坏了. 而在javascript中,就没有 ...
最新文章
- 径向基函数神经网络_基于RBF神经网络的网络安全态势感知预测研究
- CLH锁 、MCS锁
- python列表的索引算法_Python-确定列表是否对称的算法
- 关于初始化C++类成员
- Linux02进程内存管理
- Spring 事务 以及拦截器的前后关系实验 Mybatis 日志拦截
- 一棵树的生物量怎么算_宾利的眼镜盒价值2万,算坑人吗?网友:良心产品,不坑穷人...
- es6 箭头函数 rest参数 扩展运算符
- 最全原理图元器件查询
- 【delete用法 与 object(对象)的创建】
- 近日总结3.17-3.19(windows server)
- 河钢唐钢微尔云计算中心对外签订首个合同
- flea-db使用之基于对象池的FleaJPAQuery
- 观海智能观海舆情大数据SaaS云平台
- java方法的通用格式,【学习笔记】使用Java读取、写入Excel全版本(包含xls、xslx格式)通用方法及代码展示(POI)...
- 大华SDK+JAVA+4g网络摄像头进行二次开发
- 支付宝又要刷屏了,红包活动开始了
- 时钟芯片 服务器,通用实时时钟芯片
- Python 83道经典练习题,含答案!
- npm删除项目所有依赖和清缓存清缓存的办法
热门文章
- 程序员面试时这样介绍自己的项目经验,成功率能达到98.99%
- Linux的secureCRT设置字体大小
- mysql行转列sql函数_sql动态行转列的两种方法
- python语言程序设计实践教程答案实验六_20192417 实验一《Python程序设计》实验报告...
- 流水调度问题c语言,基于遗传算法的流水车间调度问题汇总.doc
- PHP大文件上传问题
- php加密登录_PHP写一个简单的网页加密认证
- controller怎么调用controller_SpringMVC五大核心组件及调用过程
- ai去除水印_ai全自动视频剪辑软件,每天批量制作800条原创视频!
- 【uni-app】swiper 实现纵向轮播,且支持鼠标滚轮滚动翻页