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 this 深入理解
Jul 30 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
May 03 Javascript
浅析tr的隐藏和显示问题
Mar 05 Javascript
jQuery trigger()方法用法介绍
Jan 13 Javascript
jQuery实现区域打印功能代码详解
Jun 17 Javascript
javascript设计模式Constructor(构造器)模式
Aug 19 Javascript
D3.js进阶系列之CSV表格文件的读取详解
Jun 06 Javascript
Angular4如何自定义首屏的加载动画详解
Jul 26 Javascript
vue+django实现一对一聊天功能的实例代码
Jul 17 Javascript
vue 实现用户登录方式的切换功能
Apr 14 Javascript
jQuery实现异步上传一个或多个文件
Aug 17 jQuery
如何用Node.js编写内存效率高的应用程序
Apr 30 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
将数组写入txt文件 var_export
2009/04/21 PHP
php实现分页工具类分享
2014/01/09 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
yii2利用自带UploadedFile实现上传图片的示例
2017/02/16 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
为原生js Array增加each方法
2012/04/07 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
JavaScript检测原始值、引用值、属性
2016/06/20 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
echart简介_动力节点Java学院整理
2017/08/11 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
Python中pygame安装方法图文详解
2015/11/11 Python
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
介绍一下Java中的Class类
2015/04/10 面试题
党校培训自我鉴定范文
2014/03/20 职场文书
健康家庭事迹材料
2014/05/02 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
教师个人年度总结
2015/02/11 职场文书
试用期自我评价范文
2015/03/10 职场文书
生产车间主任岗位职责
2015/04/08 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
初中军训感言
2015/08/01 职场文书
css3应用示例:新增的选择器
2022/03/16 HTML / CSS