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

js中模仿块级作用域

js中没有块级作用域的概念,例如:function printNumber(num) { for(var i = 0; i < num; i ++ ) { co...
  • csdn_zsdf
  • csdn_zsdf
  • 2017年03月12日 11:59
  • 372

JavaScript闭包--模仿块级作用域

在阅读这篇文章之前,建议先阅读JavaScript的作用域链以及JavaScript闭包–简介。正如闭包的定义一样:“闭包指的是有权访问另一个函数作用域中的变量的函数”, 闭包最大的意义就在于闭包可以...
  • saberVIII
  • saberVIII
  • 2016年06月15日 16:33
  • 366

Javascript中模仿块级作用域

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

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

简单的块级作用域: javascript没有块级作用域的概念 function test(){ for(var i = 1 ; i ...
  • bq1073100909
  • bq1073100909
  • 2015年09月24日 08:44
  • 1528

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

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

JavaScript学习-模仿块级作用域

1,介绍 JavaScript没有块级作用域的概念,在块语句中定义的变量,实际上是在包含函数中而非语句中创建的。 2,语法 可以用匿名函数来模仿块级作用域,块级作用域通常称为私有 作用域,语法如下:(...
  • theroadofprogrammers
  • theroadofprogrammers
  • 2017年04月05日 18:14
  • 90

javascript 模仿块级作用域

转自JavaScript高级程序设计i(第三版): javascript没有块级作用域的概念,只有两个环境,函数环境和全局环境。 function test(){ for(var i=0;i...
  • u013250416
  • u013250416
  • 2015年08月13日 11:06
  • 316

javascript模仿块级作用域

javaScript 没有块级作用域的概念。这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的,来看下面的例子:function outputNumbers(count){ f...
  • liwenfei123
  • liwenfei123
  • 2017年09月13日 10:48
  • 152

JavaScript:模仿块级作用域

JavaScript 没有块级作用域的概念。这意味着在块语句中定义的变量,实际上是在包含它们的函数中而非语句中创建的,看下面的例子: function outputNumbers(count){ ...
  • github_37320188
  • github_37320188
  • 2018年02月09日 14:52
  • 13

js的函数作用域跟块级作用域

一,js中的作用域     js中除了全局作用域,还有函数作用域。     嗯,还有块级作用域。 二,函数作用域跟块级作用域的区别     当将代码看成一个IIFE时,全局作用域其实就是一个函数作用域...
  • huangjq36SYSU
  • huangjq36SYSU
  • 2016年04月07日 14:34
  • 4131
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Javascript中模仿块级作用域
举报原因:
原因补充:

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