javascript函数声明和函数表达式区别分析


Posted in Javascript onDecember 02, 2014

平时再用js写函数的时候,一般都是以惯例 function fn () {} 的方式来声明一个函数,在阅读一些优秀插件的时候又不免见到 var fn = function () {} 这种函数的创建,究竟他们用起来有什么区别呢,今天就本着打破砂锅问到底的精神,好好来说说这个让人神魂颠倒的--函数声明。

函数声明

函数声明示例代码

function fn () {

    console.log('fn 函数执行..');

    // code..

}

这样我们就声明了一个名称为fn的函数,这里出个思考,你认为在这个函数的上面来调用他的话会执行吗?还是会报错?

fn(); // 在之前调用我们声明的fn函数 function fn () { console.log('fn 函数执行..'); // code..}

控制台输出结果:

javascript函数声明和函数表达式区别分析

是的,此时fn函数是可以被调用到的,这里来总结下原因。

总结:

1:此时fn函数是变量的结果,默认存储在全局上下文的变量中(可用 window.函数名 来验证)

2:此方式为函数声明,在进入全局上下文阶段创建,代码执行阶段,它们已经可用。ps:javaScript在每次进入方法时都会先初始化上下文环境(由全局 → 局部)

3:它可以影响变量对象(仅影响存储在上下文中的变量)

函数表达式

函数表达式示例代码

var fn = function () {

    console.log('fn 函数【表达式】声明执行..')

    // code..

}

这样我们就声明了一个匿名函数,并且把它的引用指向了变量fn

再次在该表达式声明的函数上下方各调用一次,来看控制台的输出结果。

// 为了清晰的看到控制台的输出,我们在各自调用前后做个标记,增加可读性。

console.log('之前调用开始..');

fn();

console.log('之前调用结束..');

var fn = function () {

    console.log('fn 函数【表达式】声明执行..')

    // code..

}

console.log('之后调用开始..');

fn();

console.log('之后调用开始..');

控制台打印结果:

javascript函数声明和函数表达式区别分析

可以看到代码在执行到第一次调用fn()函数的时候,提示:fn is not a function (fn 不是一个方法),遇到错误而终止运行。

这说明在第一次调用fn()的同时,var fn 变量没有做为全局对象的一个属性而存在,且 fn 引用的匿名函数上下文也没有被初始化,所以在他之前调用失败。

// 现在先把之前的调用逻辑给注释掉,再看下控制台的输出

//    console.log('之前调用开始..');

//    fn();

//    console.log('之前调用结束..');

    var fn = function () {

        console.log('fn 函数【表达式】声明执行..')

        // code..

    }

    console.log('之后调用开始..');

    fn(); // 在表达式之后调用

    console.log('之后调用开始..');

控制台打印结果:

javascript函数声明和函数表达式区别分析

可以看出,在该表达式函数之后来调用是可以的,来总结下那是为什么呢?

总结:

1:首先变量本身不做为一个函数存在,而是一个匿名函数的引用(值类型的不属于引用)

2:在代码执行阶段,初始化全局上下文时,它没有被做为全局的一个属性而存在,所以不会造成变量对象的污染

3:该类型的声明一般在插件的开发比较常见,也可做为闭包中回调函数的调用

所以 function fn () {} 并不等于 var fn = function () {} ,他们有本质上的区别。

以上就是本文的全部内容了,思路很清晰,对比也很明确,是篇非常不错的文章,小伙伴们一定要仔细研读下

Javascript 相关文章推荐
js 强制弹出窗口代码研究-又一款代码
Mar 20 Javascript
善用事件代理,警惕闭包的性能陷阱。
Jan 20 Javascript
jquery基础教程之deferred对象使用方法
Jan 22 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
Sep 03 Javascript
Jquery使用css方法改变样式实例
May 18 Javascript
ECharts仪表盘实例代码(附源码下载)
Feb 18 Javascript
js实现商品抛物线加入购物车特效
Nov 18 Javascript
bootstrap栅格系统示例代码分享
May 22 Javascript
vue项目中mock.js的使用及基本用法
May 22 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
Oct 31 Javascript
vue-model实现简易计算器
Aug 17 Javascript
vue实现拖拽交换位置
Apr 07 Vue.js
javascript常用方法汇总
Dec 02 #Javascript
js时间日期格式化封装函数
Dec 02 #Javascript
JavaScript基础语法、dom操作树及document对象
Dec 02 #Javascript
JavaScript基础知识学习笔记
Dec 02 #Javascript
Js 正则表达式知识汇总
Dec 02 #Javascript
21个JavaScript事件(Events)属性汇总
Dec 02 #Javascript
bootstrap改变按钮加载状态
Dec 01 #Javascript
You might like
Terran热键控制
2020/03/14 星际争霸
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
List Installed Hot Fixes
2007/06/12 Javascript
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
理解javascript中try...catch...finally
2015/12/25 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
vue-router路由参数刷新消失的问题解决方法
2017/06/17 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
django做form表单的数据验证过程详解
2019/07/26 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
opencv 阈值分割的具体使用
2020/07/08 Python
浅析NumPy 切片和索引
2020/09/02 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
美国最顶级的精品店之一:Hampden Clothing
2016/12/22 全球购物
中学教师自我鉴定
2014/02/07 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书