工作中发觉原生 js 还有待加强,只好再啃一遍高程3了。
ECMAScript的变量是松散类型的,所谓松散类型就是(变量)可以用来保存任意类型的数据。换句话说每个变量仅仅是在特定的时间内保存值的占位符而已。
所谓特定的时间就是变量的生命周期。
关于生命周期就要说到‘作用域’,进而得说‘作用域链’。此处只做简单介绍,后面会详细介绍作用域和作用域链。
js中没有块状作用域( if语句 ),只有全局作用域和函数作用域。
(var定义的变量将称为该作用域中的局部变量 即全局下就是全局变量,函数内就是局部变量)
全局作用域:在全局下有效(全局定义或函数内未定义只赋值的变量),即window下都可以使用。
函数作用域:只在函数体内有效,函数运行完函数、变量立即销毁,这也是无法在外面引用函数内的变量的原因。
定义:
var message;
var user;
定义了名为message user的变量,可以用来保存任何值。未初始化的会保存一个undefined
console.log(message);// undefined
函数退出后,变量销毁.
function test(){
var msg='hi'; // 局部变量
}
test();
console.log(msg);// 错误
函数体内未定义只赋值的变量是全局变量:
function test(){
msg='hi';// 全局变量 不太推荐 因为在局部定义全局变量 难以维护
}
test();
console.log(msg);// 'hi'
变量提升(只是声明提升,赋值(初始化)没有提升):
function test(){
console.log(msg);
var msg='hi';
};
test();// undefined
console.log(msg);// msg is not defined
由此可以看出变量 msg 提升到了函数test()的顶部,初始化并没有提升,如下: