Javascript中模仿块级作用域

转载 2012年03月27日 14:40:19

在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域)。而在javascript中则没有块级作用域,首先来看一段代码:

for(var i=0;i<10;i++){

}
alert(i);

 执行结果是:

10

 

对于有块级作用域的语言来说,for语句中定义并初始化的变量i在循环外是无法访问的,而在javascript中,for语句中定义的变量i在循环结束后,依旧会存在于循环外部的执行环境(作用域)中,在这里i的作用域是全局环境。具体来说就是:使用var关键字声明变量时,这个变量会自动添加到距离最近的可用环境中。对于函数而言,这个最近的环境就是函数的局部环境。如果变量在未经声明的情况下被初始化,则该变量会被自动添加到全局环境。

不过有时候的确很需要块级作用域来解决一些问题,这时候我们就可以使用匿名函数来模仿块级作用域。

匿名函数就是没有名字的函数,有时候也被称为拉姆达(lamda)函数。形式如下:

 

function functionName(arg0,arg1){
    
//函数体
}

  

而用作模仿块级作用域(私有作用域)的匿名函数的语法形式如下:

(function(){

    
//块级作用域

})();

以上代码的意思是:首先定义并立即调用一个匿名函数。将函数声明包含在圆括号中,表示它实际上是一个函数表达式。而紧随其后的另一对圆括号表示立即调用这个函数。

可能刚开始我们感觉这种语法比较难以理解,我们可以先看下下面这段代码:

var myFunc=function(){
    alert(‘函数’);
};
myFunc();

上面的代码中,首先以函数表达式的方式定义了一个函数,然后立即调用它。在这里定义函数的方式就是先创建一个匿名函数,然后将其赋值给变量myFunc,而在函数名称后加一对圆括号即表示调用函数。那我们如果直接用匿名函数代表变量myFunc,在匿名函数后面添加一对圆括号不就表示直接调用了吗?然而,如果如下这样做就会报错:

function(){
    
//块级作用域
}();

因为在javascript中,function关键字表示一个函数声明的开始,而函数声明后面不能直接跟圆括号。而函数表达式后面可以跟圆括号,来表示函数调用。在函数声明外面加一对圆括号就可以转换成函数表达式,如下:

(function(){

    
//块级作用域

})();

这样最简单的块级作用域就创建好了。这种技术长在全局作用域中用在函数外部,来限制向全局作用域中添加过多的变量和函数。例如:

(function(){    
    
var now=new Date();
    
if(now.getMonth()==0&&now.getDate()==1){
        alert(“Happy 
new year”);    
    }
})();

以上代码放在全局作用域中,用来确定在1月1日显示一条祝贺新年的信息。其中变量now现在就是匿名函数模仿的块级作用域中的局部变量。

当然,只要我们临时需要一些变量,都可以使用块级作用域(私有作用域)。当匿名函数执行完毕,其作用域链立即销毁,从而可以减少闭包占用资源问题。

转载自:http://www.cnblogs.com/fengmiaosen/archive/2011/01/10/1932403.html

相关文章推荐

JavaScript模仿块级作用域与私有变量

一、块级作用域JS没有块级作用域的概念,定义在块语句中的变量,实际上是在包含函数中而非语句中创建的,如下面例子,变量i和j创建之后即便离开了块语句,只要还在包含函数func中,就可以访问到这两个变量。...
  • hongchh
  • hongchh
  • 2016年08月17日 09:53
  • 547

手把手教你在 JavaScript 中模仿块级作用域

JavaScript 没有块级作用域的概念,所以在块语句中定义的变量,实际上包含在函数中:function outputNumbers(count) { for (var i = 0; i <...

Javascript中模仿块级作用域

在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域)。而在javascript中则没有块级作用域,首先来看一段代码: for(var i=0;i10;i++){ ...

JavaScript高级程序设计之函数表达式之模仿块级作用域第7.3讲笔记

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

Javascript中没有块级作用域(模仿)

在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域)。而在javascript中则没有块级作用域,首先来看一段代码:function test(){ ...

关于JavaScript没有块级作用域的分析

问题在其他类C语言中,由花括号封闭的代码块都有自己的作用域(ECMAScript叫做自己的执行环境),但是JavaScript没有块级作用域例如: if(true){ var col...
  • iamcgt
  • iamcgt
  • 2017年06月10日 12:49
  • 201

javascript之块级作用域的概念和闭包

简单的块级作用域: javascript没有块级作用域的概念 function test(){ for(var i = 1 ; i ...

重温javascript--垃圾回收机制和块级作用域

垃圾回收机制JavaScript有一种自动垃圾回收机制,也就是说执行环境会负责管理代码执行过程中使用的内存,在开发过程中就无需考虑内存分配及无用内存的回收问题了。JavaScript垃圾回收的机制很简...

JavaScript易错点:没有块级作用域

在其他类C的语言中,由花括号封闭的代码块都有自己的作用域(执行环境),因而支持根据条件来定义变量。但在JavaScript中没有类似的块级作用域,所以下面的代码在JS中并不会得到想象中的结果。if (...

JavaScript中的块级作用域、私有变量与模块模式

1.块级作用域(私有作用域),经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。 (function(count){ for(var i=0;i0、1、2、3、4 }...
  • bboyjoe
  • bboyjoe
  • 2016年06月01日 22:54
  • 279
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Javascript中模仿块级作用域
举报原因:
原因补充:

(最多只允许输入30个字)