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 相关文章推荐
jQuery图片的展开和收缩实现代码
Apr 16 Javascript
深入理解jQuery中live与bind方法的区别
Dec 18 Javascript
js在指定位置增加节点函数insertBefore()用法实例
Jan 12 Javascript
浅析Ajax语法
Dec 05 Javascript
Canvas 制作动态进度加载水球详解及实例代码
Dec 09 Javascript
轻松理解vue的双向数据绑定问题
Oct 30 Javascript
vue项目tween方法实现返回顶部的示例代码
Mar 02 Javascript
angularjs下ng-repeat点击元素改变样式的实现方法
Sep 12 Javascript
vue watch关于对象内的属性监听
Apr 22 Javascript
javascript实现计算器功能
Mar 30 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
Apr 09 Javascript
Node与Python 双向通信的实现代码
Jul 16 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常用表单验证类用法实例
2015/06/18 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
CI框架常用方法小结
2016/05/17 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
用JS剩余字数计算的代码
2008/07/03 Javascript
js DataSet数据源处理代码
2010/03/29 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
详解maxlength属性在textarea里奇怪的表现
2015/12/27 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
jquery拖拽自动排序插件使用方法详解
2020/07/20 jQuery
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
小程序实现日历左右滑动效果
2019/10/21 Javascript
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
django用户注册、登录、注销和用户扩展的示例
2018/03/19 Python
Python中的集合介绍
2019/01/28 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
Python Numpy库datetime类型的处理详解
2019/07/13 Python
Python Web版语音合成实例详解
2019/07/16 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
升国旗仪式主持词
2014/03/19 职场文书
开业主持词
2014/03/21 职场文书
食品安全宣传标语
2014/06/07 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
群众路线对照检查剖析材料
2014/10/09 职场文书
唐山大地震的观后感
2015/06/05 职场文书
解析MySQL binlog
2021/06/11 MySQL
浅析Python中的套接字编程
2021/06/22 Python
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL