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 循环调用示例介绍
Nov 20 Javascript
javascript使用call调用微信API
Dec 15 Javascript
javascript求日期差的方法
Mar 02 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
Aug 10 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
Nov 16 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
Nov 16 Javascript
微信小程序 实战程序简易新闻的制作
Jan 09 Javascript
Vue路由跳转问题记录详解
Jun 15 Javascript
vue项目开发中setTimeout等定时器的管理问题
Sep 13 Javascript
Vue 根据条件判断van-tab的显示方式
Aug 03 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 Vue.js
详解JavaScript中的执行上下文及调用堆栈
Apr 29 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创建PDF中文文档
2006/10/09 PHP
PHP性能优化 产生高度优化代码
2011/07/22 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
Mootools 1.2教程 函数
2009/09/15 Javascript
javascript 节点排序 2
2011/01/31 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
再谈JavaScript线程
2015/07/10 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
js H5 canvas投篮小游戏
2016/08/18 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
webpack是如何实现模块化加载的方法
2019/11/06 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
python创建关联数组(字典)的方法
2015/05/04 Python
在Python中定义和使用抽象类的方法
2016/06/30 Python
对python中return和print的一些理解
2017/08/18 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
潘婷洗发水广告词
2014/03/14 职场文书
宣传活动总结范文
2014/07/01 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
如何写早恋检讨书
2014/09/10 职场文书
奉献家乡演讲稿
2014/09/13 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
教育教学读书笔记
2015/07/02 职场文书
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL