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!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Jizhen_Tan/article/details/50170389

var 作用域||变量

平常我们在使用js 的时候一般使用var来声明变量,相比于C语言Java当中的声明变量要简单一些,但是简单肯定也会有简单的不好之处。 一般来讲,在函数内部(local variable)中,js初始化...
  • qq_26769677
  • qq_26769677
  • 2017-04-06 15:14:32
  • 1488

JS中的块级作用域,var、let、const三者的区别

首先,ECMAScript和JavaScript关系:       ECMAScript是一个国际通过的标准化脚本语言。JavaScript由ECMAScript和DOM、BOM三者组成。可以简单理...
  • hot_cool
  • hot_cool
  • 2017-10-21 12:22:35
  • 1288

深入理解JS中的变量作用域

文章转载http://blog.csdn.net/beijiguangyong/article/details/8301707点击打开链接 在JS当中一个变量的作用域(scope)是程序中定义这个变...
  • bbs375
  • bbs375
  • 2016-09-09 08:45:54
  • 3873

JavaScript变量的作用域&是否有var 的区别

javascript 块级作用域
  • Yy921117
  • Yy921117
  • 2016-07-04 21:12:21
  • 604

理解 js的作用域

1.ES5中的作用域for(var i =0;i
  • qq_23980427
  • qq_23980427
  • 2017-01-21 14:02:34
  • 6887

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

一,js中的作用域     js中除了全局作用域,还有函数作用域。     嗯,还有块级作用域。 二,函数作用域跟块级作用域的区别     当将代码看成一个IIFE时,全局作用域其实就是一个函数作用域...
  • huangjq36SYSU
  • huangjq36SYSU
  • 2016-04-07 14:34:40
  • 4575

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

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

关于var、作用域

window.str1 = 'union'; function t1() { var str1 = 'China'; ...
  • jiaobuchong
  • jiaobuchong
  • 2015-02-06 21:20:38
  • 620

js中var的作用域和输出问题

关于js 中var的问题: 1、var声明的变量是函数作用域; 2、var声明变量会提前到文件最开始的地方,但是初始化还是在语句位置。 示例代码: var a; console.log(a); ...
  • qiuchunguang
  • qiuchunguang
  • 2017-03-03 14:59:21
  • 453

初步探究ES6之let,const和块级作用域

我们知道javascript定义变量的方式是var,但是var有几个问题。var第一个就是作用域的问题,var不是针对一个块级作用域,而是针对一个函数作用域。举个例子:function runTowe...
  • mevicky
  • mevicky
  • 2015-11-13 09:28:41
  • 5070
收藏助手
不良信息举报
您举报文章:JavaScript的作用域和块级作用域概念理解
举报原因:
原因补充:

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