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模仿块作用域的更多相关文章

  1. javascript模仿块级作用域(第一篇)

    作用域有词法作用域和块级作用域之分,javascript属于词法作用域,而在java.C++中却是块级作用域.在javascript中,只有函数能够创建作用域,作用域是以function作为边界的. ...

  2. 深入理解JavaScript中的作用域和上下文

    介绍 JavaScript中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,我会尽我所能用最简单的方式来解释作用域.理解作用域将使你的代码脱颖而出,减 ...

  3. JavaScript模仿块级作用域

    avaScript 没有块级作用域的概念.这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的,来看下面的例子: function outputNumbers(count){ for ( ...

  4. 深入理解 JavaScript 变量的作用域和作用域链

    一个变量的作用域(scope)是程序源代码中定义这个变量的区域.简单的说,作用域就是变量与函数的可访问范围.全局变量拥有全局作用域,在JavaScript代码中的任何地方都有定义.局部变量是在函数体内 ...

  5. [转]深入理解JavaScript的变量作用域

    1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在整个函数中都有定义. 5.未使用var关键字定 ...

  6. 深入理解JavaScript的变量作用域(转载Rain Man之作)

    在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...

  7. 深入理解JavaScript的变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...

  8. 理解JavaScript中的作用域和上下文

    JavaScript对于作用域(Scope)和上下文(Context)的实现是这门语言的一个非常独到的地方,部分归功于其独特的灵活性. 函数可以接收不同的的上下文和作用域.这些概念为JavaScrip ...

  9. 理解JavaScript中的作用域

     什么是变量,什么是作用域? 变量:简单来说就是在特定时间内保存特定值的一个名字而已,由于不存在定义某个变量必须要保存某种数据类型值的规则,所以变量的值及其数据类型可以在脚本生命周期内任意改变,变量可 ...

随机推荐

  1. 世界杯:用Python分析热门夺冠球队-(附源代码)

    2018年,火热的世界杯即将拉开序幕.在比赛开始之前,我们不妨用 Python 来对参赛队伍的实力情况进行分析,并大胆的预测下本届世界杯的夺冠热门球队. 通过数据分析,可以发现很多有趣的结果,比如: ...

  2. read file into shell vars

    test.ksh value=$(<rosstest.txt)echo $value

  3. JSTL介绍

    JSTL介绍 一.介绍 JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标 ...

  4. 【Naive Splay Template】

    写小作业的时候重新复习了一下splay 只支持插入,删除,查k大,查节点数.没有迭代器. T类型需要重载==和<,要调用拷贝构造函数. template<class T> class ...

  5. java集合系列之三(ArrayList)

    上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayLi ...

  6. BZOJ 1854: [Scoi2010]游戏 并查集

    1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 2672  Solved: 958[Submit][Status][ ...

  7. SGU 405 Totalizator

    405. Totalizator Time limit per test: 0.25 second(s)Memory limit: 65536 kilobytes input: standardout ...

  8. .net正则提取手机号码,并替换带有手机号码的a标签

    //用正则查找字符串中的手机号码,最后替换成带a标签的可打电话的字符串 var str = "收件人:江苏省苏州市工业园区屌丝大叔收,电话:18688888888"; var re ...

  9. DeJaVu update history

    17.05.08 <-> Added Audi RB8 random code direct change -> Now can adapt VIN based keys or ke ...

  10. UI---------EventSystem

    创建uGUI控件后,Unity会同时创建一个叫EventSystem的GameObject,用于控制各类事件.可以看到Unity自带了两个Input Module,一个用于响应标准输入,一个用于响应触 ...