js变量声明提升
1、变量提升
根据javascript的运行机制和javascript没有块级作用域这个特点,可以得出,变量会声明提升移至作用域 scope (全局域或者当前函数作用域) 顶部的。
- 变量声明提升至全局域
console.log(a); // undefined var a ="Hi"; 相当于 var a; // 变量提升到全局作用域 console.log(a); // 已声明变量a,但未初始化,固为undefined a="Hi";
- 变量声明提升至当前函数域
var name = "boy"; (function () { if (typeof name == 'undefined') { var name = 'girl'; console.log('Hi,' + name); } else { console.log('Hi,' + name); } })();// 控制台输出Hi,girl 相当于 var name = "boy"; (function () { var name; //变量提升到当前函数作用域 if (typeof name == 'undefined') { name = 'girl'; console.log('Hi,' + name); } else { console.log('Hi,' + name); } })();
2、undefined和未定义(not defined)区别
-
undefined
undefined
表达的含义有三种情况:
- 这个变量 存在 ,但是并没有给予任何值。
- 一种普通的数据类型和一种值。你可以手工将任何变量赋值为 undefined,此时其没有特别含义。
- 一个 存在的对象 中的一个 不存在 (没有声明)的值,会被认为是 undefined。
对这三种情况进行归纳,undefined 可以如下总结:
- 它是一种数据类型,也是一种值。
- 有这种值的时候,要么它本身被赋值,要么本身存在,要么其所在对象存在。完全不存在的变量不会是 undefined。
-
未定义(not defined)
一个 未定义
(not defined) 的变量是 完全没有任何声明 的变量。这样的变量在使用时会直接抛出致命错误。但是,如果使用 typeof 来判断这样的变量,不但不会出错,而且竟然会返回 undefined
,这使得无法使用 typeof 来区分这两种情况。