前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学弟的一张图,让我重学了一遍函数声明和函数表达式!

学弟的一张图,让我重学了一遍函数声明和函数表达式!

作者头像
是乃德也是Ned
发布2022-08-04 10:08:04
2840
发布2022-08-04 10:08:04
举报
文章被收录于专栏:前端成长日记前端成长日记

前言

今天下午,在我们微信群里,学弟突然发出来这样一个图:

我点开一看,这不是函数声明跟函数表达式的知识点吗?前一阵子还看过相关文章。

看了几眼,我说到:「第一个输出应该是最后的函数声明」

然后呢?没有然后了,真的,犹豫代表着此时的我不会。

❝看来卷的还不够! ❞

先贴上答案,如果你跟我一样犹豫不决,不知道结果,那么跟我一起再次学习一遍吧。

image.png

开始复习

「首先,确定问题:函数表达式和函数声明的区别,以及困扰住我们的优先问题」

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

函数声明

首先我们要知道,当函数声明与变量命名冲突的时候,要保持着「函数声明优先的原则」

代码语言:javascript
复制
fn();
function fn () {
    console.log(‘fn’);
}
var fn = 2;

例如这样,「不会报错」,会输出fn。

❝如果你不知道为什么调用函数可以在函数声明之前,看这里: 是因为javascript代码是一段一段预载的,在一段代码预载完成后,会把函数声明提前到代码段的前面执行,以便在代码段的任何地方调用,所以前面的代码无错 ❞

那么,多个同名的函数声明,会如何呢?我们接着来看一下

代码语言:javascript
复制
fn();
function fn () {
    console.log(‘1’);
}
function fn () {
    console.log(‘2’);
}

输出结果为2。这是因为有「多个函数声明的时候,是由最后的函数声明来替代前面的」

❝这也是我上文中读了几眼代码直接说第一个输出为最后的函数声明的原因! ❞

函数表达式
代码语言:javascript
复制
fn();
var fn = function () {
    console.log('fn');
}

有用过的同学可能看到这里,说我知道,完后写出了上面这段代码,但其实这段代码是不对的,会爆出fn is not a function这个错误。

这是什么原因呢?这其实就是「函数声明和函数表达式的区别之一」

「因为函数表达式相当于把一个函数当做值,赋予一个变量,而这个变量在未声明的时候,是不能使用的」

正确的函数表达式:

代码语言:javascript
复制
var fn = function () {
    console.log('fn');
}
fn();

复习回来,再战!

先把代码贴出来方便阅读:

代码语言:javascript
复制
// 下面的代码输出什么
function method(foo){
 console.log(foo)
 var foo = 'A'
 var foo = function () {
  console.log('B')
 }
 foo()
 function foo() {
  console.log('C')
 }
 foo()
}
var foo = 1
method(foo)

经过了上面的复习,我们知道,JavaScript会将函数声明提前,所以我们来整理一下这段代码:

代码语言:javascript
复制
function method(foo){
 function foo() {
  console.log('C')
 }
 console.log(foo)
 var foo = 'A'
 var foo = function () {
  console.log('B')
 }
 foo()
 foo()
}
var foo = 1
method(foo)

现在,再利用我们刚刚学的知识,来分析打印的都是什么数据:

首先,第一个打印的是我们「输出C的foo函数」,第二个和第三个调用foo函数的时候,「函数表达式的变量已经声明」了!所以函数发生了「覆盖」,现在的foo函数已经是「输出B的foo函数」了。

现在让我们来整理一下结果:

代码语言:javascript
复制
function foo() {
    console.log('C')
}
B
B

「你学会了吗?没学会快去看看相关知识点!」

最后

但是犹豫就是不会,不能拿「曾经学过」当做借口,把遇到的每一个自己不会的问题弄懂,才能逐渐让自己变得更强!

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

本文分享自 前端成长日记 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 开始复习
    • 函数声明和函数表达式的区别
      • 函数声明
      • 函数表达式
  • 复习回来,再战!
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档