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 对象模型 执行模型
Dec 06 Javascript
取得元素的左和上偏移量的方法
Sep 17 Javascript
深入理解javascript构造函数和原型对象
Sep 23 Javascript
node.js中的console.log方法使用说明
Dec 09 Javascript
AngularJs定制样式插入到ueditor中的问题小结
Aug 01 Javascript
jquery 抽奖小程序实现代码
Oct 12 Javascript
Koa项目搭建过程详细记录
Apr 12 Javascript
vue.js 实现点击展开收起动画效果
Jul 07 Javascript
微信小程序实现跑马灯效果
Oct 21 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
Sep 05 Javascript
vue element-ui实现动态面包屑导航
Dec 23 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
Feb 14 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
PHP 编写大型网站问题集
2010/05/07 PHP
php读取纯真ip数据库使用示例
2014/01/26 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
JS request函数 用来获取url参数
2010/05/17 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
js 赋值包含单引号双引号问题的解决方法
2014/02/26 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
javascript 中的console.log和弹出窗口alert
2016/08/30 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
2017/06/23 jQuery
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
AngularJS 控制器 controller的详解
2017/10/17 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
Python注释详解
2016/06/01 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
Python2手动安装更新pip过程实例解析
2020/07/16 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
linux面试题参考答案(6)
2014/08/29 面试题
Java的类与C++的类有什么不同
2014/01/18 面试题
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
世界气象日活动总结
2015/02/27 职场文书