ECMAScript变量是松散类型的,可以用于保存任何类型的数据。
1. var 关键字
var message = "hi";message = 100; // 合法,但不推荐// 在这个例子中,变量 message 首先被定义为一个保存字符串值 hi 的变量,然后又被重写为保存了数值 100。虽然不推荐改变变量保存值的类型,但这在 ECMAScript 中是完全有效的。
虽然可以通过省略 var 操作符定义全局变量,但不推荐这么做。在局部作用域中定义的全局变量很难维护,也会造成困惑。这是因为不能一下子断定省略 var 是不是有意而 为之。在严格模式下,如果像这样给未声明的变量赋值,则会导致抛出 ReferenceError。
- var 声明提升
function foo() {console.log(age);var age = 26;}foo(); // undefined//之所以不会报错,是因为 ECMAScript 运行时把它看成等价于如下代码:function foo() {var age;console.log(age);age = 26;}foo(); // undefined// 这就是所谓的“提升”(hoist),也就是把所有变量声明都拉到函数作用域的顶部。此外,反复多次使用 var 声明同一个变量也没有问题。
