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

    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. 扩展、接管MVC都不会,还说会Spring Boot?

    持续原创输出,点击上方蓝字关注我 目录 前言 Spring Boot 版本 如何扩展MVC? 如何自定义一个拦截器? 什么都不配置为什么依然能运行MVC相关的功能? 如何全面接管MVC?[不推荐] 为 ...

  2. 多测师讲解接口测试 _HTTP常见的状态码归纳_高级讲师肖sir

    100 Continue  初始的请求已经接受,客户应当继续发送请求的其余部分 101 Switching Protocols  服务器将遵从客户的请求转换到另外一种协议 200 OK  一切正常,对 ...

  3. Python错误:AssertionError: group argument must be None for now

    运行多线程出现的错误 调试了很久,最后发先 __init__ 写错了,修改后后,运行正确.

  4. python 使用pyinstaller打包程序

    使用pyinstaller 打包.py脚本,在其他计算机可以直接运行,不需要python环境 安装pyinstaller库 pip install pystaller 打包程序 pyinstaller ...

  5. 【C++入门学习笔记】函数和对象!你需要这一篇文章入门C++!

    一.本篇要学习的内容和知识结构概览   二.知识点逐条分析 1. 混合型语言 C++源文件的文件扩展名为.cpp, 也就是c plus plus的简写, 在该文件里有且只能有一个名为main的主函数, ...

  6. nginx优化:使用expires在浏览器端缓存静态文件

    一,nginx中expires指令的作用 网站的图片等静态文件一旦发布,通常很少改动, 为了减小对服务器请求的压力,提高用户浏览速度, 我们可以设置nginx中的expires, 使用户访问一次后,将 ...

  7. jmeter环境变量配置

    参考博客:超全 https://blog.csdn.net/qq_39720249/article/details/80721777

  8. 【应用服务 App Service】当遇见某些域名在Azure App Service中无法解析的错误,可以通过设置指定DNS解析服务器来解决

    问题情形 当访问部署在Azure App Service中的应用返回 "The remote name could not be resolved: ''xxxxxx.com'" ...

  9. centos 8 集群Linux环境搭建

    一.集群Linux环境搭建 1. 注意事项 1.1 windows系统确认所有的关于VmWare的服务都已经启动 打开任务管理器->服务,查看五个VM选项是否打开. 1.2 确认好VmWare生 ...

  10. 人生第一篇博客 , 当然是经典的 "Hello World"

    package com.cqvie.Hello; public class FirstDemo {  public static void main(String[] args) {  System. ...