Javascript中的var变量声明作用域问题
先看一下这两段代码的执行结果
var name2 = 'What!';
function a() {
if (typeof name2 === 'undefined') {
console.log('Undefined');
var name2 = 'Jack';
} else {
console.log('Hello ' + name2);
}
}
a();
将if语句中的var声明注释掉
var name2 = 'What!';
function a() {
if (typeof name2 === 'undefined') {
console.log('Undefined');
//var name2 = 'Jack';
} else {
console.log('Hello ' + name2);
}
}
a();
前一个会输出Undefined
, 后一个会输出Hello What!
. 说明在if里的var变量声明, 会影响到外部.
再运行一个代码
function f1(){
if (typeof name3 === 'undefined') {
console.log("undefined");
var name3 = "anything";
}
if (typeof name3 !== 'undefined') {
console.log("defined!");
}
}
f1();
if (typeof name3 === 'undefined') {
console.log("undefined outside");
}
这段代码会输出
undefined
defined!
undefined outside
说明这个影响的范围仅在于函数内部, 不会影响到函数外
说明
JavaScript的变量声明没有块级作用域, 例如在Java中, 可以这样声明b, 这个b的作用域仅在于if内部
if (a == null) {
String b = "c";
}
在JavaScript中, 只有两种作用域: 全局和局部, 在函数内任意语句中使用var声明的变量, 不管所在的语句块实际是否会执行, 都等价于在函数开头声明, 前面的代码等价于
var name2 = 'What!';
function a() {
var name2;
if (typeof name2 === 'undefined') {
console.log('Undefined');
name2 = 'Jack';
} else {
console.log('Hello ' + name2);
}
}
a();
这样产生的输出就容易理解了.