javaScript的函数对象的声明详解


Posted in Javascript onFebruary 06, 2015

写作缘由:

平时再用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窗口功能指南之在窗口中书写内容
Jul 21 Javascript
js 格式化时间日期函数小结
Mar 20 Javascript
js利用与或运算符优先级实现if else条件判断表达式
Apr 15 Javascript
JavaScript中:表达式和语句的区别[译]
Sep 17 Javascript
JS操作CSS随机改变网页背景实现思路
Mar 10 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
Apr 25 Javascript
js分页代码分享
Apr 28 Javascript
浅谈Javascript如何实现匀速运动
Dec 19 Javascript
jquery图片切换实例分析
Apr 15 Javascript
Vue组件BootPage实现简单的分页功能
Sep 12 Javascript
layui中layer前端组件实现图片显示功能的方法分析
Oct 13 Javascript
vue2中引用及使用 better-scroll的方法详解
Nov 15 Javascript
javascript实用方法总结
Feb 06 #Javascript
javascript实现限制上传文件大小
Feb 06 #Javascript
jquery实现鼠标滑过显示提示框的方法
Feb 05 #Javascript
javascript去除字符串左右两端的空格
Feb 05 #Javascript
jQuery判断对象是否存在的方法
Feb 05 #Javascript
jquery实现对联广告的方法
Feb 05 #Javascript
jquery实现在光标位置插入内容的方法
Feb 05 #Javascript
You might like
笑谈配置,使用Smarty技术
2007/01/04 PHP
php 防止单引号,双引号在接受页面转义
2008/07/10 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
2013/11/07 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
详解PHP数组赋值方法
2015/11/07 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
2018/03/15 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
浅谈webpack devtool里的7种SourceMap模式
2019/01/14 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
vue实现计算器功能
2020/02/22 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
python中的列表推导浅析
2014/04/26 Python
python实现bucket排序算法实例分析
2015/05/04 Python
python监控文件或目录变化
2016/06/07 Python
Python 绘图和可视化详细介绍
2017/02/11 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
使用TFRecord存取多个数据案例
2020/02/17 Python
行政助理岗位职责
2013/11/10 职场文书
前台文员岗位职责及工作流程
2013/11/19 职场文书
高中英语教学反思
2014/02/04 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
银行优秀员工事迹材料
2014/05/29 职场文书
法律意见书范文
2015/06/04 职场文书