先看以下几段烧脑的代码:

    f();//=>?
var f = function () {
console.log("var");
} function f() {
console.log("function");
}  

控制台打印结果"function"。

另一段代码

    var f = function () {
console.log("var");
} function f() {
console.log("function");
}
f();//=>?

控制台打印结果"var"。

关于函数声明和函数表达式更具体的定义在javascript函数中有相关详细的介绍,这里就不再叙述。上述代码主要用于引出函数声明和函数表达式的区别。

函数声明和函数表达式的区别本质其实是函数声明提升和变量声明提升的区别。

一般变量的声明为以下形式:

    var a=10;

js在预编译阶段,是这么处理的:

    //预编译阶段
var a;
//执行阶段
a=10;

预编译阶段,js将其分解为变量声明与变量赋值。

一般函数声明:

    function fDeclaration(){
console.log("declaration");
}

预编译阶段,js将其分解为类似以下的变量声明与变量赋值:

    //预编译
var fDeclaration;
fDeclaration = function () {
console.log("declaration");
}

在标识符相同的情况下,js如何处理变量与函数呢?

    var f = function () {
console.log("var");
}
function f() {
console.log("function");
}
f();//=> 在控制台会打印什么结果呢?

函数声明提前优先于变量声明提前。因此上面代码JS预编译会做类似如下处理:

    /* 预编译阶段
*函数声明提前优先级别更高,先进行预编译,并对f进行了赋值。
*在预编译阶段后于函数声明,f经历两次赋值,后来的赋值替代了原先的赋值,表现为f执行函数表达式。
*/ //函数声明预编译阶段
var f;
f = function () {
console.log("function");
}
//函数表达式提前预编译,由于它是变量声明,变量声明提前是只有声明提前,而没有赋值提前。
//重复的声明,js会忽略
var f;
/*执行阶段*/
//变量f再次赋值
f = function () {
console.log("var");
}
f();//=>"var"

Js中函数声明和函数表达式的区别的更多相关文章

  1. JS中函数声明与函数表达式的不同

    Js中的函数声明是指下面的形式: function functionName(){   } 这样的方式来声明一个函数,而函数表达式则是类似表达式那样来声明一个函数,如 var functionName ...

  2. JS中函数声明与函数表达式的异同

    相同点 注:函数声明和函数表达式的相同点包括但不限于以下几点 函数是一个值,所以和其他值一样,函数也可以进行被输出.被赋值.作为参数传给其他函数等相关操作,不管函数是以什么方式被定义的,当然和其他值的 ...

  3. JS中的函数声明和函数表达式的区别,即function(){}和var function(){},以及变量提升、作用域和作用域链

    一.前言 Uncaught TypeError: ... is not a function function max(){}表示函数声明,可以放在代码的任何位置,也可以在任何地方成功调用: var ...

  4. JS的一些总结(函数声明和函数表达式的区别,函数中的this指向的问题,函数不同的调用方式,函数也是对象,数组中的函数调用)

    一.函数声明和函数表达式的区别: 函数声明放在if——else语句中,在IE8中会出现问题 函数表达式则不会 <script> if(true){ function f1(){ conso ...

  5. js中的函数声明和函数表达式的区别

    目录 一.声明与表达式的格式 1.1 声明式的格式: 1.2 表达式的格式: 二.区别 2.1 函数表达式可以直接在后面加括号执行,而函数声明不可以. 2.2 函数表达式可以被提前解析出来 2.3 命 ...

  6. js函数声明和函数表达式的区别

    Javascript Function无处不在,而且功能强大!通过Javascript函数可以让JS具有面向对象的一些特征,实现封装.继承等,也可以让代码得到复用.但事物都有两面性,Javascrip ...

  7. 转载 js函数声明和函数表达式

    在js中函数有两种表达方式.1 函数声明 2 函数表达式 函数声明 function sayname(){ alert("li lei"); } 函数表达式 var sayname ...

  8. JavaScript(js)函数声明与函数表达式的区别

    在JavaScript中,函数是经常用到的,在实际开发的时候,我想很多人都没有太在意函数的声明与函数表达式的区别,但是呢,这种细节的东西对于学好js是非常重要的. 函数声明与函数表达式用代码写出来是这 ...

  9. 【JS】函数提升变量提升以及函数声明和函数表达式的区别

    今天看js的变量提升问题,里面提到了函数提升.然后发现自己之前一直把函数声明和函数表达式弄错,导致函数提升出错 一.变量提升 console.log(a) var a=100 //undefined ...

随机推荐

  1. docker-创建容器常见选项

    1. docker run创建容器常见选项 1.1 创建容器 选项 描述 -i,-interactive 交互式 -t,-tty 分配一个伪终端 -d,-detach 运行容器到后台 -e,-env ...

  2. docker容器命令1

    docker容器命令 新建并启动容器命令 docker run INAME(镜像名字) 语法:docker run [OPTIONS] INAME [COMMAND] 例子:docker run -i ...

  3. 多测师讲解常用的测试工具分为10类_高级讲师肖sir

    我们将常用的测试工具分为10类. 1. 测试管理工具 2. 接口测试工具 3. 性能测试工具 4. C/S自动化工具 5.白盒测试工具 6.代码扫描工具 7.持续集成工具 8.网络测试工具 9.app ...

  4. Rust之路(0)

    Rust--一个2012年出现,2015年推出1.0版本的"年轻"语言.在 2016 至 2018 年的 stack overflow 开发人员调查中,被评比为 "最受欢 ...

  5. 1、微信小程序开发介绍。

    微信小程序如何能达到快速的开发效果,下面首先介绍一下需要的框架,使用这些框架可以减少大部分编写代码时间. 微信小程序使用的框架:weui开源框架 后端数据使用的框架(包含管理和api接口框架):YiS ...

  6. redis6安装 centos系统

    Redis6 安装   在centos7.5服务器上按照官方发布的安装方式并不能进行正确的安装,现收集并整理如下安装方式,亲测有效 1.安装依赖 yum install -y cpp binutils ...

  7. spring boot:spring security实现oauth2授权认证(spring boot 2.3.3)

    一,oauth2的用途? 1,什么是oauth2? OAuth2 是一个开放标准, 它允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像.照片.视频等), 在这个过程中无须将用户名和密码 ...

  8. go 爬取页面保存

    package main import ( "bufio" "fmt" "io/ioutil" "net/http" & ...

  9. fastdfs之同一台storage server下包含多个store path

    一,查看本地centos的版本 [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 说 ...

  10. selenium基础 --获取内容

    from time import sleep from selenium import webdriver browser = webdriver.Chrome() url = "http: ...