一直看到这个问题,但是也一直觉得不是什么大问题,所以一直没写。看到这个问题面试会问,那就把他学习一下。大概的就是当我们 var tag = 2 这样的去定义一个变量的时候,变量会被提升到作用域的顶部,就算在代码最后一行定义的变量,也会被提升到最前面。
先看俩个错误
Uncaught ReferenceError: a is not defined
//a 没有被定义
undefined
//a 没有实际的值
上代码,来个例子
function fo(){
console.log(a);
console.log(b);
var a = 2;
}
fo()
/* 运行结果 这样就很好理解错误的意思了。
* undefined
* Uncaught ReferenceError: b is not defined
* 所以在函数 fo() 中,变量 a 已经被识别到,但是未定义值,变量 b 没被识别到
*/
出现这个结果的原因是这样的(不考虑 b 的情况,b 和变量提升无关):
function fo(){
var a;
console.log(a);
a = 2;
}
//变量 a 被提升到了函数作用域的最上端,但是值未定义,所以打印出了 undefined.
再看个函数
function f(){
a = 1;
var a;
console,log(a); // 1
}
// 因为变量 a 被提升到函数作用域的最上端,所以先定义,后赋值,最后打印,所以打印出了 1 .
最后看道面试题(其他地方看到的)
console.log(v1);
var v1 = 100;
function foo() {
console.log(v1);
var v1 = 200;
console.log(v1);
}
foo();
console.log(v1);
/*
* undefined
* undefined
* 200
* 100
* 实际的执行顺序:
* var v1(gobal)
* console.log(v1(gobal)) undefined
* v1(gobal) = 100
* foo()
* var v1(foo())
* console.log(v1(foo())) undefined
* v1(foo()) = 200
* console.log(v1(f00())) 200
* console.log(v1(gobal)) 100
*/
其实这东西不难…