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 相关文章推荐
FCK调用方法..
Dec 21 Javascript
javascript 一些用法小结
Sep 11 Javascript
ajax 同步请求和异步请求的差异分析
Jul 04 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
Jul 10 Javascript
在JS中如何调用JSP中的变量
Jan 22 Javascript
jquery中radio checked问题
Mar 16 Javascript
Javascript监视变量变化的方法
Jun 09 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
Apr 18 Javascript
JavaScript自学笔记(必看篇)
Jun 23 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
Dec 01 Javascript
javascript循环链表之约瑟夫环的实现方法
Jan 16 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
Feb 20 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
杏林同学录(三)
2006/10/09 PHP
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
js加解密 脚本解密
2008/02/22 Javascript
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
2015/05/09 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
Vue 自定义指令功能完整实例
2019/09/17 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
《太阳》教学反思
2014/02/21 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书
创文明城市标语
2014/06/16 职场文书
法学自荐信
2014/06/20 职场文书
质量主管工作职责
2014/09/26 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
公务员年终个人总结
2015/02/12 职场文书
生活委员竞选稿
2015/11/21 职场文书
Django debug为True时,css加载失败的解决方案
2021/04/24 Python
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技