在 JavaScript中,如果变量在 函数体内 是使用 var 关键字声明的变量,是局部变量;不用 var 关键字声明的变量是全局变量。
下面这段JavaScript代码运行后会发生什么?
// 代码1
// filename is test.js
var test = function(){
var f = "hello world";
}
test();
console.log(f);
运行:
node test.js
// 输出 ReferenceError: f is not defined
我们稍微修改一下上面的代码
// 代码2
// filename is test.js
var test = function(){
f = "hello world"; // 这行有修改
}
test();
console.log(f);
运行:
node test.js
// 输出 hello world
变量 f 都是在test 函数中进行声明的,运行test() 函数后,为什么会有两种完全不同的输出呢?这个其实和JavaScript中的变量作用域有关。
在JavaScript中,变量一般分为:局部变量 和全局变量。顾名思义,局部变量的作用域在函数体内;全局变量的作用域是整个JavaScript运行周期。
上面的两段代码最主要的区别就是,在函数体内变量 f 的声明方式。
var f = "hello world" // 局部变量
与
f = "hello world" // 全局变量
代码1 运行时,变量 f 是使用 var 关键字声明,所以变量f 是一个局部变量,变量的作用域只有 test 函数体内,所以在外面consloe.log(f) 时,JavaScript检测到变量 f 并没有被声明,所以出现 ReferenceError: f is not defined 的错误。
代码2 运行时,变量 f 没有使用 var 关键字,所以变量f 是一个全局变量。console.log(f) 时,会直接打印变量的值:hello world 。