JavaScript的作用域和块级作用域概念理解

原创 2015年12月04日 09:21:55

作用域


作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期。说到这里我们需要理解两个概念:块级作用域与函数作用域。

函数作用域


这个应该好理解,函数作用域就是说定义在函数中的参数和变量在函数外部是不可见的。

大多数类C语言都拥有块级作用域,JS却没有。请看下文demo:

//C语言 
#include <stdio.h> 
void main() 
{ 
int i=2; 
i--; 
if(i) 
{ 
int j=3; 
} 
printf("%d/n",j); 
}

运行这段代码,会出现“use an undefined variable:j”的错误。可以看到,C语言拥有块级作用域,因为j是在if的语句块中定义的,因此,它在块外是无法访问的。

块级作用域


任何一对花括号中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。

正如我们举的C语言的例子,大多数类C语言都是有块级作用域的,那么在JavaScript又有什么不同呢?

我们一起看看这个JavaScript的demo:

functin test(){ 
for(var i=0;i<3;i++){ 
} 
alert(i); 
} 
test();

运行这段代码,弹出”3”,可见,在块外,块中定义的变量i仍然是可以访问的。也就是说,JS并不支持块级作用域,它只支持函数作用域,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的。

那么我们该如何使JS拥有块级作用域呢?是否还记得,在一个函数中定义的变量,当这个函数调用完后,变量会被销毁,我们是否可以用这个特性来模拟出JS的块级作用域呢?看下面这个demo:

function test(){ 
(function (){ 
for(var i=0;i<4;i++){ 
} 
})(); 
alert(i); 
} 
test();

这时候再次运行,会弹出”i”未定义的错误,哈哈,实现了吧~~~这里,我们把for语句块放到了一个闭包之中,然后调用这个函数,当函数调用完毕,变量i自动销毁,因此,我们在块外便无法访问了。

JS的闭包特性is the most important feature((^__^) 大家懂的)。在JS中,为了防止命名冲突,我们应该尽量避免使用全局变量和全局函数。那么,该如何避免呢?不错,正如上文demo所示,我们可以把要定义的所有内容放入到一个

(function (){ 
//内容 
})();

之中,这时候,我们是不是相当于给它们的外层添加了一个函数作用域呢?该作用域之外的程序是无法访问它们的。

Happy hacking!

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

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

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

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

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

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

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

JavaScript的作用域和块级作用域概念理解

作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期。讲到这里,首先理解两个概念:块级作用域与函数作用域。 什么是块级作用域呢? 任何一对花括号({和})中的语句集...

Javascript中模仿块级作用域

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

JavaScript中的块级作用域和私有变量

模仿块级作用域: JavaScript没有块级作用域的概念。这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的。 看一个例子:  function outputNumbers(c...

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

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

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

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

Javascript中模仿块级作用域

Javascript中模仿块级作用域 在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域)。而在javascript中则没有块级作用域,首先来看一段代码: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JavaScript的作用域和块级作用域概念理解
举报原因:
原因补充:

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