//据说是一道经典面试题目
/*
console.log(v1); //undefined
var v1 = 100;
function foo() {
console.log(v1); //undefined
var v1 = 200;
console.log(v1); //200
}
foo();
console.log(v1); //100
*/
// 下面 从变量提升角度 修改一下代码
var v1;
console.log(v1); //此时虽然可以使用v1 但是没有赋值 所以undefined
v1 = 100; //这里的var 是要提升到顶部的
function foo() {
var v1; //这里的v1 和函数外面的v1 没有任何关系 不要混淆,反之,外面的v1 和它也没有关系
console.log(v1); //此时,虽然可以使用v1 但是没有赋值 所以 undefined
v1 = 200; //这里的var 是要提升到顶部的(自己所在块的顶部)
console.log(v1); //200
}
foo();
console.log(v1); //这里的v1 是自己块的v1 和foo里的v1 米有关系,所以100
我们习惯将var a =100;看做是一个声明,而实际上javascript引擎并不这么认为。
它将var a和a = 100看做是两个单独的声明,第一个是编译阶段的任务,而第二个则是执行阶段的任务。
这意味着无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理,可以将这个过程形象地想象成所有的声明(变量和函数)都会被“移动”到各自作用域(不是必须 函数)的最顶端,这个过程被称为提升 |