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 相关文章推荐
JavaScript中的对象化编程
Jan 16 Javascript
能说明你的Javascript技术很烂的五个原因分析
Oct 28 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
Oct 19 Javascript
JS实现网页上随机产生超链接地址的方法
Nov 09 Javascript
判断横屏竖屏(三种)
Feb 13 Javascript
Bootstrap常用组件学习(整理)
Mar 24 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
May 13 jQuery
ReactJs实现树形结构的数据显示的组件的示例
Aug 18 Javascript
Mint UI 基于 Vue.js 移动端组件库
Nov 07 Javascript
如何从0开始用node写一个自己的命令行程序
Dec 29 Javascript
Vue data的数据响应式到底是如何实现的
Feb 11 Javascript
Element Input输入框的使用方法
Jul 26 Javascript
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
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
php使用PDO方法详解
2014/12/27 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
yii数据库的查询方法
2015/12/28 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
用js做一个小游戏平台 (一)
2009/12/29 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
Python全局变量用法实例分析
2016/07/19 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
Python使用requests发送POST请求实例代码
2018/01/25 Python
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
美国羽绒床上用品第一品牌:Pacific Coast
2018/08/25 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
诺思信科技(南京)有限公司.NET笔试题答案
2013/07/06 面试题
Unix如何在一行中运行多个命令
2015/05/29 面试题
八年级生物教学反思
2014/01/22 职场文书
音乐节策划方案
2014/06/09 职场文书
班组拓展活动方案
2014/08/14 职场文书
助残日活动总结
2014/08/27 职场文书
教师党员自我剖析材料
2014/09/29 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
名人传读书笔记
2015/06/26 职场文书
上班旷工检讨书
2015/08/15 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书
python本地文件服务器实例教程
2021/05/02 Python