a = 2; console.log(a); var a; /*这里会输出2 如果按从上往下的执行顺序的话应该输出的是undefined,但是js编译器会把声明变量全部提升到顶部来进行变量声明。所以上面代码等同于:*/ var a; a = 2; console.log(a);
从上面例子初步理解了js变量提升后再看下面个例子:
console.log(a); var a = 2;
按常规逻辑大多人肯定认为会输出2 结果是undefined 为什么呢 因为只有声明本身才会被提升 赋值是不会提升的 因为赋值不是编译阶段的事情,所以上面代码等同于:
var a; console.log(a); a=2
函数提升:
foo(); // function foo() { // console.log('foo');//这里会正常输出 // } var foo = function () { console.log('foo');//这里则会报typeerror } //说明函数声明会被提升 而函数表达式则不会提升
函数提升优先级更高:
foo(); var foo; function foo() { console.log('foo'); } /* 按照常规思维 函数和变量都提升了 为什么这里不会报typeerror错误 而是正常输出呢 因为函数声明的优先级高过变量声明 所以函数foo声明之后 变量foo属于重复声明而被自动忽略了 */