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 错误处理与调试经验总结
Aug 10 Javascript
Jquery刷新页面背景图片随机变换的实现方法
Mar 15 Javascript
Dom 学习总结以及实例的使用介绍
Apr 24 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
Jun 30 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
Aug 26 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
Sep 19 Javascript
AngularJS基础 ng-options 指令详解
Aug 02 Javascript
D3.js实现直方图的方法详解
Sep 25 Javascript
Vue实现web分页组件详解
Nov 28 Javascript
详解Nuxt.js Vue服务端渲染摸索
Feb 08 Javascript
使用typescript开发angular模块并发布npm包
Apr 19 Javascript
解决vue-loader加载不上的问题
Oct 21 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学习之 循环结构实现代码
2011/06/09 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
yii用户注册表单验证实例
2015/12/26 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
PHP SESSION跨页面传递失败解决方案
2020/12/11 PHP
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
浅析JavaScript中浏览器的兼容问题
2016/04/19 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
Python2.7读取PDF文件的方法示例
2017/07/13 Python
Python编程之Re模块下的函数介绍
2017/10/28 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
python爬取微信公众号文章
2018/08/31 Python
Python自动化完成tb喵币任务的操作方法
2019/10/30 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
html5如何及时更新缓存文件(js、css或图片)
2013/06/24 HTML / CSS
质检员的岗位职责
2013/11/15 职场文书
同事吵架检讨书
2014/02/05 职场文书
统计岗位职责
2014/02/21 职场文书
校长师德表现自我评价
2015/03/05 职场文书
小学德育工作总结2015
2015/05/12 职场文书
建国大业观后感600字
2015/06/01 职场文书
Mysql 设置boolean类型的操作
2021/06/04 MySQL