Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Javascript的函数声明和函数表达式

Javascript的函数声明和函数表达式

作者头像
前端黑板报
发布于 2019-09-19 09:41:12
发布于 2019-09-19 09:41:12
57200
代码可运行
举报
文章被收录于专栏:前端黑板报前端黑板报
运行总次数:0
代码可运行

Javascript定义函数有两种类型

函数声明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // 函数声明
    function wscat(type){
        return type==="wscat";
    }

函数表达式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // 函数表达式
    var oaoafly = function(type){
        return type==="oaoafly";
    }

先看下面这个经典问题,在一个程序里面同时用函数声明和函数表达式定义一个名为getName的函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    getName()//oaoafly
    var getName = function() {
        console.log('wscat')
    }
    getName()//wscat
    function getName() {
        console.log('oaoafly')
    }
    getName()//wscat

上面的代码看起来很类似,感觉也没什么太大差别。但实际上,Javascript函数上的一个“陷阱”就体现在Javascript两种类型的函数定义上。

JavaScript 解释器中存在一种变量声明被提升的机制,也就是说函数声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是会被提升至最前面。

而用函数表达式创建的函数是在运行时进行赋值,且要等到表达式赋值完成后才能调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    var getName//变量被提升,此时为undefined
    getName()//oaoafly 函数被提升 这里受函数声明的影响,虽然函数声明在最后可以被提升到最前面了
    var getName = function() {
        console.log('wscat')
    }//函数表达式此时才开始覆盖函数声明的定义
    getName()//wscat
    function getName() {
        console.log('oaoafly')
    }
    getName()//wscat 这里就执行了函数表达式的值

所以可以分解为这两个简单的问题来看清楚区别的本质

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    var getName;
    console.log(getName)//undefined
    getName()//Uncaught TypeError: getName is not a function
    var getName = function() {
        console.log('wscat')
    }
            var getName;
    console.log(getName)//function getName() {console.log('oaoafly')}
    getName()//oaoafly
    function getName() {
        console.log('oaoafly')
    }

这个区别看似微不足道,但在某些情况下确实是一个难以察觉并且“致命“的陷阱。出现这个陷阱的本质原因体现在这两种类型在函数提升和运行时机(解析时/运行时)上的差异。

当然我们最后要给一个总结:Javascript中函数声明和函数表达式是存在区别的,函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。而函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。这个微小的区别,可能会导致JS代码出现意想不到的bug,让你陷入莫名的陷阱中。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端黑板报 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端同学经常忽视的一个 JavaScript 面试题
这几天面试上几次碰上这道经典的题目,特地从头到尾来分析一次答案,这道题的经典之处在于它综合考察了面试者的JavaScript的综合能力,包含了变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级等知识,此题在网上也有部分相关的解释,当然我觉得有部分解释还欠妥,不够清晰,特地重头到尾来分析一次,当然我们会把最终答案放在后面,并把此题再改高一点点难度,改进版也放在最后,方便面试官在出题的时候有个参考,更多详情可关注本文作者@Wscats
前端达人
2020/04/10
4900
前端同学经常忽视的一个 JavaScript 面试题
函数声明与函数表达式
定义一个函数的方法主要有三种 函数声明、函数表达式、new Function构造函数,函数声明与函数表达式定义的函数较为常用,构造函数的方式可以将字符串定义为函数。
WindRunnerMax
2020/08/27
5730
函数表达式在JavaScript中是如何工作的?
在JavaScript中,函数表达式是一种将函数赋值给变量的方法。函数表达式可以出现在代码的任何位置,而不仅仅是函数声明可以出现的位置。函数表达式的语法如下:
王小婷
2023/10/23
4510
JavaScript(js)函数声明与函数表达式的区别
在JavaScript中,函数是经常用到的,在实际开发的时候,我想很多人都没有太在意函数的声明与函数表达式的区别,但是呢,这种细节的东西对于学好js是非常重要的。
全栈学习笔记
2022/03/31
8370
函数表达式
定义函数的方式有两种:第一种是“函数声明”,另一种就是“函数表达式”。 “函数声明”会被提升,意味着把函数声明放在调用它的语句后面。 示例1:
奋飛
2019/08/15
5050
javascript中函数声明与函数表达式
在javascript中,我们经常要声明函数,或者使用函数表达式,今天我们就来说说这两者的区别。
小明爱学习
2020/01/21
5050
【JavaScript】预解析 ① ( 变量预解析 - 变量提升 | 函数预解析 - 函数提升 | 函数表达式预解析 )
JavaScript 代码 是 由 浏览器 的 JavaScript 解析器 执行的 , 执行过程分如下两步 :
韩曙亮
2024/04/09
1820
【JavaScript】预解析 ① ( 变量预解析 - 变量提升 | 函数预解析 - 函数提升 | 函数表达式预解析 )
灵活使用JS函数声明与函数表达式要弄清哪两点?
要弄清函数声明和函数表达式的区别,首先要明白在JS中声明和表达式的行为存在十分微妙而又十分重要的差别。
前端_AWhile
2019/08/29
6840
JavaScript立即执行函数的解释分析(2)—函数表达式与函数声明的区别
上次我们聊了聊表达式与语句的区别,这次我们说说函数表达式与函数声明,上次虽然提到过这两点,但是并没有很详细的讲,这次要专门聊聊了!
FEWY
2019/05/26
5770
JavaScript进阶-函数表达式与闭包
在JavaScript的世界里,函数不仅是执行特定任务的代码块,它们还拥有独特的属性和行为,如函数表达式和闭包,这些特性极大地丰富了语言的功能和灵活性。本文将深入浅出地探讨这两个概念,揭示它们的工作原理、常见问题、易错点及避免策略,并通过实例代码加深理解。
Jimaks
2024/06/19
1120
JavaScript进阶-函数表达式与闭包
javascript中函数声明和函数表达式浅析
记得在面试腾讯实习生的时候,面试官问了我这样一道问题。 //下述两种声明方式有什么不同 function foo(){}; var bar = function foo(){};  当初只知道两种声明方式一个是函数声明一个是函数表达式,具体有什么不同没能说得很好。最近正好看到这方面的书籍,就想好好总结一番。 在ECMAScript中,有两个最常用的创建函数对象的方法,即使用函数表达式或者使用函数声明。对此,ECMAScript规范明确了一点,即是,即函数声明 必须始终带有一个标识符(Identifier)
Sb_Coco
2018/05/28
9562
JS 中的函数表达式和函数声明你混淆了吗?
在 JavaScript 中,function关键字可以完成一个简单的工作:创建一个函数。 但是,使用关键字定义函数的方式可以创建具有不同属性的函数。
前端小智@大迁世界
2022/06/15
7770
学弟的一张图,让我重学了一遍函数声明和函数表达式!
有用过的同学可能看到这里,说我知道,完后写出了上面这段代码,但其实这段代码是不对的,会爆出fn is not a function这个错误。
是乃德也是Ned
2022/08/04
3730
学弟的一张图,让我重学了一遍函数声明和函数表达式!
函数声明与表达式的区别
HTML5学堂:函数有不同的定义方法,一种是函数声明,另一种是函数表达式,那么这两种有何区别呢? 函数声明的基本语法 function functionName(arg0, arg1, ..., argn) { // 函数体 - HTML5学堂 } 函数声明的重要特征:函数声明提升 在执行代码之前,会先读取函数声明,这也就意味着,可以把函数声明放在调用它的语句的后面。 函数表达式的常见语法形式 var functionName = function(arg0, arg1, ..., argn) {
HTML5学堂
2018/03/12
7820
IIFE 立即执行函数表达式
IIFE全称为Immediately Invoked Function Express-立即执行函数(表达式),顾名思义,是在定义之后立即执行的函数。IIFE主要以保护变量范围著称,时候也会被称为“自执行的匿名函数”(self-executing anonymous function)。
泯泷、
2024/03/11
1360
浅谈JavaScript的函数表达式(闭包)
  前文已经简单的介绍了函数的闭包。函数的闭包就是有权访问另一个函数作用域的函数,也就是函数内部又定义了一个函数。 1 var Super=function(num){ 2 var count=num; 3 return function(){ 4 console.log(count); 5 } 6
水击三千
2018/02/27
6520
浅谈自执行函数(立即调用的函数表达式)
既然函数名加上括号fun1()就是执行函数。 思考:直接取赋值符号右侧的内容直接加个括号,是否也能执行? 试验如下,直接加上小括弧:
celineWong7
2020/11/05
3.6K0
Javascript中的函数声明和函数表达式
Javascript有很多有趣的用法,在Google Code Search里能找到不少,举一个例子:
LA0WAN9
2021/12/14
6040
函数声明与函数表达式
函数声明:直接声明一个函数 function fnName() {};function声明必须有方法名,而出现在表达式里的方法名都会被忽略。
meteoric
2018/11/15
7910
【JavaScript】函数 ⑦ ( 函数定义方法 | 命名函数 | 函数表达式 )
在 函数表达式 中 , 可以将 匿名函数 赋值给一个变量 , 上面的语法结构就是 将 匿名函数 赋值给 变量 的 语法 ;
韩曙亮
2024/04/09
2830
【JavaScript】函数 ⑦ ( 函数定义方法 | 命名函数 | 函数表达式 )
推荐阅读
相关推荐
前端同学经常忽视的一个 JavaScript 面试题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验