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 相关文章推荐
jquery 指南/入门基础
Nov 30 Javascript
javascript采用数组实现tab菜单切换效果
Dec 12 Javascript
如何在MVC应用程序中使用Jquery
Nov 17 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
Jun 11 Javascript
JavaScript设计模式经典之工厂模式
Feb 24 Javascript
Jquery判断form表单数据是否变化
Mar 30 Javascript
JS中图片压缩的方法小结
Nov 14 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
Nov 21 Javascript
AngularJS实现的锚点楼层跳转功能示例
Jan 02 Javascript
webpack4之SplitChunksPlugin使用指南
Jun 12 Javascript
如何为vue的项目添加单元测试
Dec 19 Javascript
js获取图片的base64编码并压缩
Dec 05 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图片处理类(水印、透明度、旋转)
2015/10/21 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
js innerHTML 的一些问题的解决方法
2008/06/22 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
jquery中$each()方法的使用指南
2015/04/30 Javascript
JavaScript实现格式化字符串函数String.format
2016/12/16 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
Vue仿支付宝支付功能
2018/05/25 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
angular 服务随记小结
2019/05/06 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
[03:08]TI9战队档案 - Vici Gaming
2019/08/20 DOTA
python判断端口是否打开的实现代码
2013/02/10 Python
在Python的web框架中配置app的教程
2015/04/30 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
Python读写锁实现实现代码解析
2020/11/28 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
戴尔马来西亚官网:Dell Malaysia
2020/05/02 全球购物
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
教师研修随笔感言
2014/01/23 职场文书
信息技术教学反思
2014/02/12 职场文书
房地产活动策划方案
2014/05/14 职场文书
高中学生自我评价范文
2014/09/23 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
家电创业计划书
2019/08/05 职场文书
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang
微信小程序基础教程之echart的使用
2021/06/01 Javascript
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL