引用《JavaScript权威指南》(第六版)中的举例
代码段1:
- var scope="global";
- function f(){
- console.log(scope);
- scope="local"
- console.log(scope);
- }
- f();
会输出什么?
答案:undefined global
代码段2:
- var scope="global";
- function f(){
- var scope;
- console.log(scope);
- scope="local"
- console.log(scope);
- }
- f();
又会输出什么?
答案:undefined global
代码段3:
- var scope="global";
- function f(){
- console.log(scope);
- }
- f();
又会输出什么?
答案:global
通过以上三个例子,下面解释“JavaScript没有块级作用域,有函数作用域”这句话。
在JavaScript中,由于函数作用域的特性,代码段1和代码段2是等价的,局部变量在整个函数体是中是有定义的,
也就是说,代码段1在函数体内的局部变量scope覆盖了同名全局变量,并且只有在程序执行到var 语句的时候,局部变量scope才会被真正的
赋值。因此,上述过程等价于:将函数内的变量声明“提前”至函数体顶部,同时变量初始化留在原来的位置:也就是代码段2。
在具有块级作用域的编程语言中,在狭小的作用域里让变量声明和使用变量的代码尽可能靠近彼此,通常来讲,这是一个非常不错的编程
习惯。由于JavaScript没有块级作用域,因此,一些程序员特意将变量声明放在函数体顶部,而不是将声明靠近放在使用变量之处。这种做法
使得他们的源代码非常清晰地放映了知识的变量作用域。
时间: 2024-10-13 00:28:01