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和Ajax中文乱码吐血版解决方案
Dec 21 Javascript
纯js实现无限空间大小的本地存储
Jun 18 Javascript
解析Node.js基于模块和包的代码部署方式
Feb 16 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
Aug 26 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
Nov 05 Javascript
jQuery电话号码验证实例
Jan 05 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
Jun 01 Javascript
浅谈angular.js跨域post解决方案
Aug 30 Javascript
解决vue.js 数据渲染成功仍报错的问题
Aug 25 Javascript
详解vue-cli中使用rem,vue自适应
May 06 Javascript
vue将后台数据时间戳转换成日期格式
Jul 31 Javascript
vue全屏事件开发详解
Jun 17 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
php 常用类整理
2009/12/23 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
php curl发送请求实例方法
2019/08/01 PHP
JavaScript实现动态增加文件域表单
2009/02/12 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
傻瓜式解读koa中间件处理模块koa-compose的使用
2018/10/30 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
Python中的多重装饰器
2015/04/11 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
解读python如何实现决策树算法
2018/10/11 Python
使用python进行拆分大文件的方法
2018/12/10 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
房屋继承公证书
2014/04/10 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
2015年教师党员公开承诺书
2015/01/22 职场文书
招商银行收入证明
2015/06/17 职场文书
变长双向rnn的正确使用姿势教学
2021/05/31 Python
Redis中一个String类型引发的惨案
2021/07/25 Redis
python中pycryto实现数据加密
2022/04/29 Python