JavaScript的一些特性(一)

在学习node.js过程中,往往忽略了对JavaScript基础的学习,一下做一个简要的列举。

作用域

第一个例子

想想一下在Java中,如果我们这样写一段程序:

1
2
3
4
if(true){
int a = 5;
}
System.out.println(a);

当然是有问题了,在Java/C等语言中,一段花括号就是一个独立的作用域,在作用域内定义的整形变量a,在花括号外相当于超出了作用域。而在JavaScript中,如果我们这样写:

1
2
3
4
5
var a = 3;
if(true){
var a = 5;
}
console.log(a);//输出5

这样做事完全合法的。是因为:这是因为在JavaScript中,作用域完全由函数来决定,而if/for等语􏷡中的花括􏷝不是􏴚􏱋独立的作用域。

第二个例子

我们继续写一段程序:

1
2
3
4
5
6
var a = 3;
var obj = function(){
console.log(a);
var a = 5;
}
obj();//输出3

我们再其中再加入一行var = 5;

1
2
3
4
5
6
var a = 3;
var obj = function(){
console.log(a);
var a = 5;
}
obj();//输出undefined

在JavaScript中,变量的搜索顺序为:由内到外,顺序搜索。

在第一段例子中,console.log()会先搜索obj中是否存在变量a,没有若搜索到,所以继续向外层作用域进行搜索,所以可以看到输出为3的结果。

在第二段例子中,现在obj中搜索到 var a = 5;时,变量a存在,那么便不进行继续向外搜索。然而当程序执行到console.log()时,当前作用域内的a还未被初始化,所以输出 undefined的结果。

第三个例子

1
2
3
4
5
6
7
var a = 5;
function f(){
b = 6;
console.log(a);//最外层定义,变量属于全局作用域
}
f();
console.log(b);//隐式定义,变量属于全局作用域

全局作用域:顾名思义,对象在全局中都可以随时被引用。这里需要注意的是,隐式定义的变量(即不通过var定义的变量)会定义在全局作用域中,隐式定义的使用会经常出现定义了变量但被我们忘记的情况,不仅不违反了模块化编程的原则,还经常会对程序造成非常不好的影响,所以,我们在任何地方都不应该使用隐式定义。

0%