1、函数声明可以提升,所以foo()可以在上面执行。但是函数表达式不行
foo() // 3 function foo() { console.log(3) } fooNext() // Uncaught TypeError: fooNext is not a function var fooNext = function () { console.log(2) }2、变量可以提升,但是赋值不能提升
未声明d时直接打印提示参数错误
console.log(d) // Uncaught ReferenceError: d is not defined声明d但未赋值,
var d console.log(d) // undefined声明d并赋值,在输出
var d = 3; console.log(d) // 3先输出,在声明并赋值
console.log(d) // undefined 这里可不是参数错误提示。说明声明被提升了。但是赋值没有 var d = 3;意想不到的问题1:
这个结果并不是2,首先在函数obj内,是可以访问到全局变量o的。但是由于函数内部声明了一个局部的同名变量o,由于变量被提升到执行环境顶端,所以console.log的执行落后于函数内部o的声明。
var o = 2; function obj() { console.log(o) var o; } obj(); // undefined // 由于声明提升,可以简单理解为等价于下面这样 function obj() { var o; console.log(o) }意想不到的问题2:
这里有两个坑,一是块级作用域,而是变量提升,首先{}没有块级作用域,所以a被提升到全局环境最前面,所以a in window 是true,取反后为false所以不执行var赋值语句。
if (!('foo' in window)) { var foo = 1; } console.log(foo); // undefined意想不到的问题3:
函数声明会覆盖变量声明,但不会覆盖变量赋值
function foo() { console.log(2); } var foo; console.log(foo); // foo(){console.log(2);} function foo() { console.log(2); } var foo = 3; console.log(foo); // 3