您现在的位置:首页 > 技术 > JavaScript知识笔记2:JavaScript作用域

JavaScript知识笔记2:JavaScript作用域

常见的变成语言Java、C#、C++等,同样也会强调作用域这个概念:花括号包围的代码块,即为该块级内变量的作用域。JavaScript中则并非如此,请看下面代码:(以下代码实例为了能快速实现代码结果显示,均在node环境下执行)

2016年07月

透明伽然

作用域(scope)结构化编程语言重要的概念之一,它决定了变量的可见范围和生命周期。

正确使用作用域好处:

1.让代码更清晰、易读、易懂;

2.减少命名冲突;

3.符合程序垃圾回收的基本准则。作用域是垃圾回收的基本单元。

常见的变成语言JavaC#C++等,同样也会强调作用域这个概念:花括号包围的代码块,即为该块级内变量的作用域。JavaScript中则并非如此,请看下面代码:(以下代码实例为了能快速实现代码结果显示,均在node环境下执行)

在大多数类C语言中,这样的代码一定会输出变量未定义的错误。但是JavaScript中是完全合法的。

结论:JavaScript的作用域完全是有函数来决定的,iffor中的花括号不是独立的作用域。

函数作用域(局部作用域

JavaScript的作用域是通过函数来定义的,在一个函数内定义的变量只对这个函数内部可见,就称之为“函数作用域”。

在函数中引用一个变量时,JavaScript首先会搜索当前函数作用域,也可以理解为“局部作用域”,如果没有找到则开始搜索上层作用域,一直到全局作用域。

实例1


JavaScript 的函数定义是可以嵌套的,每一层是一个作用域,变量搜索顺序是从内到外。

实例2

这个运行结果其实之前我也是想不通的,f()没有输出“global,而是“undefinded”。这样的结果唯有作用域的概念可以解释:按照JavaScript作用域的搜索顺序,它会先搜索函数f的作用域,恰巧在函数f中搜到了scope变量,所以它就会停止搜索,所以上层作用中的定义的scope就被屏蔽了,但是在执行console.log语句时,scope还没有被初始化,所以得到的值就是undefined

通过实例2可以得到以下结论:

1.  对于开发者来说,在访问未定义的变量或定义了但没有初始化的变量时,获得的值都是 undefined

2.  无论在函数内什么地方定义的变量,在一进入函数时就被定义了,但直到 var 所在的那一行它才被初始化,所以在这之前引用到的都是 undefined 值。

提醒:未定义变量和值为 undefined 的变量还是有区别的。

实例3

下面看一个我们在很多JavaScript源码中见过的嵌套函数的例子

得到的结果,用上述实例2作用域的原理去理解很简单:最内层函数引用了 scope 变量,通过作用域搜索,找到了其父作用域中定义的 scope 变量。

这里要说明的是:函数作用域的嵌套关系是定义时决定的,而不是调用时决定的。需要记住的是,JavaScript的作用域是静态作用域,又叫作“词法作用域”, 这是因为作用域的嵌套关系可以在语法分析时确定,而不必等到运行时确定。

实例4



通过 f2 调用的 f1 在查找 scope 定义时,找到的是父作用域中定义的 scope 变量,而不是 f2 中定义的 scope 变量。这说明了作用域的嵌套关系不是在调用时确定的,而是在定义时确定的。

全局作用域

JavaScript 中有一种特殊的对象称为 全局对象。由于全局对象的所有属性在任何地方都是可见的,所以这个对象又称为 全局作用域。全局作用域中的变量不论在什么函数中都可以被直接引用,而不必通过全局对象。

总结满足一下条件的变量均属于全局作用域:

1.  最外层定义的变量;

2.  全局对象的属性;

3.  任何地方隐式定义的变量(未定义直接赋值的变量)。

值得注意的是:在任何地方隐式定义的变量都会定义在全局作用域中,即不通过 var 声明直接赋值的变量。这一点经常被人遗忘,而模块化编程的一个重要原则就是避免使用全局变量,所以我们在任何地方都不应该隐式定义变量。


订阅

欢迎订阅AnyForWeb出版物
欢迎订阅伽然出版物

栏目推荐

栏目推荐
JavaScript知识笔记9…

在jQuery源码中我们经常能看见各式各样…

栏目推荐
JavaScript知识笔记8…

函数的调用应该才是函数产生的根本,减…

栏目推荐
JavaScript知识笔记6…

在JS中使用操作符主要用来执行数学、相…

栏目推荐
JavaScript知识笔记5…

周知JS语法相对简单,语言结构简单,这…

栏目推荐
JavaScript知识笔记4…

JS相对于那些所谓重量级语言(C++、C#…

栏目推荐
JavaScript知识笔记3…

Javascript中this是一个指针概念,它表…

栏目推荐
JavaScript知识笔记2…

常见的变成语言Java、C#、C++等,同样…

AnyFroWebUED  

版权所有 © 2009-2016  沪ICP备14026814号-10

 

 

返回

很抱歉!

您现在还没有开通阅读权限,如有疑问,请联系我们。

联系电话:021-52047186

返回