关于“变量提升”中函数声明与函数表达式的区别

咳咳

作为一名JSer,说到“变量提升”,我们都很熟悉。曾经我也以为是这样,直到今天去百度面试,在这个问题上狠狠的栽了个跟头。

关于JSer都很熟悉的简单例子

  • 变量提升
console.log(foo)
var foo = function {
    console.log('hello world')
}

这是一个很简单的例子,大家应该很快能反应过来,输出的是undefined

  • 函数提升
foo()
function foo () {
    console.log('hello world')
}

这是也一个很简单的例子,大家应该很快能反应过来,foo函数是可以完美执行的。

今天令我栽跟头的题目

// ... 假装这里有很多不相关代码
var a = function () {
    console.log(1)
}
function a() {
    console.log(2)
}
a()

输出啥?
如果对上面那两个例子非常熟悉,其实这一题应该是能给出答案的。
函数表达式的例子,我们可以改写为:

var a  // 声明变量的操作被提升到最前面
// ... 假装这里有很多不相关代码
a = function {
    console.log(1)
}
a()

如上,a变量的声明被提前到了作用域的最前面,执行到对应处,再给a赋值。
举一反三的话?函数声明的例子怎么改呢?
举一反三的话,就一定错了。因为举着一个西瓜,是反不出一个苹果的。

function foo () {
    console.log('hello world')
}
// ... 假装这里有很多不相关代码
foo()

对于函数声明的提升,提升不仅仅是函数声明,而是这个函数的所有。我们总是把变量提升挂在嘴边,误以为变量声明提升(函数表达式本质也是一个变量声明)和函数声明提升是一回事,却忽视了重要的整体提升概念。
所以综合以上,可以把这道的面试题改下如下:

var a
function a() {
    console.log(2)
}
// ... 假装这里有很多不相关代码
a = function () {
    console.log(1)
}

a()

改写成这样的话,我想应该没有人会不知道输出什么吧?
很可惜,机会是留给有准备的人,我错过了一次好机会


原文首发于我的博客:https://www.vq0599.com/p/34
转载请注明出处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • 前端07班 王语句JavaScript程序的执行单位为行(line),也就是一行一行地执行。一般情况下,每一行就是...
    ea203453e188阅读 914评论 0 4
  • 像变量提升和函数提升这种偏学院派的问题在面试中出现的概率很高,在实际开发中也会影响到编程的效率。 前段时间在网上做...
    时和岁稔阅读 1,088评论 1 7
  • 函数声明和函数表达式有什么区别? 函数声明和函数表达式是EMACScript规定的两种不同的声明函数的方法。1.函...
    LeeoZz阅读 355评论 0 1
  • 1.介绍 赤地雪,容祖儿演唱的歌曲。曾获2006劲歌金曲优秀选第一回 得奖歌曲;2006劲歌金曲优秀选第一回 最受...
    Daming_阅读 548评论 1 1