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

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

作者: 黄努努 | 来源:发表于2017-04-20 19:57 被阅读0次

咳咳

作为一名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
转载请注明出处

相关文章

  • js函数

    函数声明和函数表达式有什么区别 函数声明: 函数表达式: JavaScript 解释器中存在一种变量声明被提升的机...

  • 函数与作用域

    函数声明和函数表达式有什么区别 函数声明会提升到当前作用于执行之前;而函数表达式提升的声明是变量的声明。 函数声明...

  • 饥人谷-任务十七

    一、函数声明和函数表达式有什么区别 (*) 主要区别函数声明会有声明提升,而函数表达式的规则跟变量一样。例:源码:...

  • 函数与作用域

    1.函数声明和函数表达式有什么区别 函数声明会提前,声明前置。声明不必放到调用的前面函数表达式是将声明变量提升,是...

  • 16. 函数与作用域

    函数声明和函数表达式的区别 函数声明 声明不必放在调用的前面 函数表达式 声明必须放到调用的前面 变量与函数的声明...

  • 函数与作用域

    1. 函数声明和函数表达式有什么区别? 函数声明会提前,即可以在函数声明之前调用函数。而函数表达式只会将变量先提升...

  • 函数

    1. 函数声明和函数表达式有什么区别? 在变量提升或声明提前过程中,函数声明是将整个被定义的函数提前,即该函数可以...

  • 进阶3

    函数声明和函数表达式有什么区别 使用函数声明,如果函数被提前调用也是可以正常运行的;如果使用函数表达式,和变量提升...

  • 函数与作用域

    函数声明和函数表达式有什么区别 函数声明 函数表达式 区别 函数表达式结束后需要加;表示声明变量结束。 函数表达式...

  • JS 函数声明和函数表达式的区别

    函数声明和函数表达式的区别优先级JavaScript的变量声明提升机制-即可以先使用,后声明函数声明会被提升到作用...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/oaglzttx.html