两个简单的例子
- 请思考下面两段代码的输出结果
add() // 0 function add () { return '函数声明' }复制代码
add () // add is not a function var add = function () { return '函数表达式' }复制代码
以上两个例子中,第一段代码中函数声明式add存在变量提升,实际上的执行顺序为:
var add add() function add () { return '函数声明' }复制代码
很好奇的是为什么同样都是函数,第二段函数表达式中似乎没有进行函数变量提升,再看一个例子:
var add = function () { return 1 } add() // 1复制代码
实际上,函数表达式定义后,并不会进行变量提升,只是会在执行的时候运行,所以才会出现此种情况。
- 再来看一段代码
var add = function () { return 0 } function add () { return 1 } add() // 0复制代码
这里实际上也是存在变量提升的,只不过是两种类型的提升,一种是var变量提升,一种是function提升,在运行之前,会提前生成执行上下文,执行上下文解析的规则则是:function早于var被提升,所以上例就很好理解了,是因为变量add覆盖了函数add。
总结了以下几点:
- 在执行上下文中存在变量提升,变量提升又分为普通变量提升与function提升,function早于其他普通变量;
- 函数表达式 定义的函数不存在变量提升,只会在执行的时候运行。函数声明才存在变量声明。