理解JavaScript模仿块作用域
1、JS没有块作用域
在C和Java中,一对大括号{}决定一个作用域,比如for循环。在js中,变量可以在函数任何一处定义,并且忽略重复定义。变量初始化之前使用,值永远是undefined。
function count(){
b=;
a=;
alert(a);//1
for(var a=;a<;a++){ // to do something }
var a;
alert(a); //
}
count();
alert(b);//1
alert(a);//a is not defined
count函数中没有定义b,所以在执行b=1时,在全局中添加了变量b;count种定义了a,注意是在for中定义的,a的作用域是count,在全局alert会报错;在for循环后面的var a是被解释器忽略的语句,因为它属于重复定义;重复定义并没有把a清空,后面的alert还是有效的。
2、模仿块级作用域
(1)块级作用域的特点:
1、内部定义的变量在外部不可用;
2、可使用外部变量;
3、立即执行不属于调用;
4、如果没定义内部变量,去掉块和加上块完全没区别。
(2)根据以上特点,使用“函数强制执行”来模拟块级作用域。根据块级作用域的特点,不需要使用声明函数,也不需要块执行后返回一个特定结果。
(3)匿名函数提供了一个子作用域,满足了块级作用域特点一;
匿名函数作为子函数,利用作用域链满足了特点二;
强制执行满足了特点三;
前三点联合起来满足了特点四。
(4)使用强制执行的匿名函数模仿块级作用域,还有一个好处是在生成闭包时,能保护父级临时变量,因为强制执行是可以传递形参的。
(5)匿名函数毕竟也是函数,因此必要时可以保存它的执行返回值。所以说,这种方式其实比块级作用域强大得多,使用起来也灵活得多。
var a=;
(function(){
var i=; //i私有变量
for(var n=;n<;n++){
i++;
}
alert(i); //
alert(a);//
})(); //函数自执行
(function(p){
alert(p+); //
})(a);
var d=(function(p){ //d全局
return p+;
})(a);
alert(d);//
alert(i);//not defined
理解JavaScript模仿块作用域的更多相关文章
- javascript模仿块级作用域(第一篇)
作用域有词法作用域和块级作用域之分,javascript属于词法作用域,而在java.C++中却是块级作用域.在javascript中,只有函数能够创建作用域,作用域是以function作为边界的. ...
- 深入理解JavaScript中的作用域和上下文
介绍 JavaScript中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,我会尽我所能用最简单的方式来解释作用域.理解作用域将使你的代码脱颖而出,减 ...
- JavaScript模仿块级作用域
avaScript 没有块级作用域的概念.这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的,来看下面的例子: function outputNumbers(count){ for ( ...
- 深入理解 JavaScript 变量的作用域和作用域链
一个变量的作用域(scope)是程序源代码中定义这个变量的区域.简单的说,作用域就是变量与函数的可访问范围.全局变量拥有全局作用域,在JavaScript代码中的任何地方都有定义.局部变量是在函数体内 ...
- [转]深入理解JavaScript的变量作用域
1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在整个函数中都有定义. 5.未使用var关键字定 ...
- 深入理解JavaScript的变量作用域(转载Rain Man之作)
在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...
- 深入理解JavaScript的变量作用域
在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...
- 理解JavaScript中的作用域和上下文
JavaScript对于作用域(Scope)和上下文(Context)的实现是这门语言的一个非常独到的地方,部分归功于其独特的灵活性. 函数可以接收不同的的上下文和作用域.这些概念为JavaScrip ...
- 理解JavaScript中的作用域
什么是变量,什么是作用域? 变量:简单来说就是在特定时间内保存特定值的一个名字而已,由于不存在定义某个变量必须要保存某种数据类型值的规则,所以变量的值及其数据类型可以在脚本生命周期内任意改变,变量可 ...
随机推荐
- HTTP请求的GET与POST方式的区别
Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法.二者主要区别如下: 1)Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据: 2)Ge ...
- PHP 笔记——面向对象编程知识点
类是属性和方法的集合,是面向对象编程方式的核心和基础,通过类可以将零散的用于实现某项功能的代码进行有效管理. 类是由class关键字.类名和成员组成的,类名不区分大小写. 在类中定义常量使用关键字 c ...
- LOJ.2587.[APIO2018]铁人两项Duathlon(圆方树)
题目链接 LOJ 洛谷P4630 先对这张图建圆方树. 对于S->T这条(些)路径,其对答案的贡献为可能经过的所有点数,那么我们把方点权值设为联通分量的大小,可以直接去求树上路径权值和. 因为两 ...
- hdu 5246 乱搞
题意:题目太长直接看链接 链接:点我 乱搞题 显然,一个人要想成功,必须大于等于最强的人的战斗力,所以我们从后往前看 这里直接拿例1解释,首先递减排个序 15,13,10,9,8 作差得2,3,1,1 ...
- hdu 4118 dfs
题意:给n个点,每个点有一个人,有n-1条有权值的边,求所有人不在原来位置所移动的距离的和最大值.不能重复 这题的方法很有看点啊,标记为巩固题 Sample Input 1 4 1 2 3 2 3 2 ...
- Java-----jar反编译修改重新打包
http://blog.csdn.net/hekewangzi/article/details/44676797 一.使用反编译工具JD-GUI(JD-GUI相关操作见Java-----反编译clas ...
- Xcode更新后插件失效解决办法
defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID 获取新版xcode的uuid Xcode6 ...
- CI下php操作memcached 的问题
CI下php操作memcached 的时候,获取memcached里不存在的key时候,会出错,然而放在程序的最后一行就不会出错,不知何故,mark一下.
- Swift 内存管理
1.Object-C 经历两个阶段: 1.手动引用计数内存管理(Manual Reference Counting,MRC) 2.自动引用计数内存管理(Automatic Refernce Count ...
- Ubuntu16.04中安装stlink驱动
系统环境: Vmware12, Ubuntu16.04 Stlink version:v1.4.0 一.安装依赖包: sudo apt-get install libusb-1.0 sudo apt- ...