变量取值与赋值和声明提前的关系
tanhui 8/2/2019
js
变量取值与赋值和声明提前的关系
在js中,存在着声明提前的行为,var 生命和function声明都会提前,如果同时存在着一个变量的var声明和function声明,那么function声明会覆盖var声明。
对于一个未声明的变量进行赋值操作,js引擎会由内向外一直查找到全局作用域,如果知道全局作用域都没有查找到这个变量,那么这个变量最终会成为一个全局变量(非严格模式下)。注意:没有使用var或function声明的变量不会存在声明提前的操作,对一个未声明的变量赋值操作时,才会使这个变量成为一个全局变量,在赋值操作之前这个变量不可用,会触发reference error错误,即该变量未被声明就使用。
例
function foo() {
var x = y;
y = 2;
}
// 运行这个foo()函数会出现什么情况呢
// 很多人认为这个程序会正常运行,认为y也会被提前声明,实际上这段程序会报错,y is not defined
// 这里只有x会被提前声明到foo作用域的顶部。然后程序开始执行,执行到 x = y这一步,会查找y,逐层向上查找,未发现y的定义,注意这里是取值操作,所以这里并不会把y声明为一个全局变量。所以这一步已经出错了。
// 只有在y=2这一步执行后,全局作用域中才会新增y变量
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8