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 相关文章推荐
精解window.setTimeout()&window.setInterval()使用方式与参数传递问题!
Nov 23 Javascript
javascript removeChild 使用注意事项
Apr 11 Javascript
JS window.opener返回父页面的应用
Oct 24 Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
Mar 12 Javascript
javascript中的取反再取反~~没有意义
Apr 06 Javascript
vue实现可增删查改的成绩单
Oct 27 Javascript
微信小程序 支付简单实例及注意事项
Jan 06 Javascript
JavaScript中 this 指向问题深度解析
Feb 21 Javascript
node.js 抓取代理ip实例代码
Apr 30 Javascript
JS鼠标滚动分页效果示例
Jul 05 Javascript
webpack项目调试以及独立打包配置文件的方法
Feb 28 Javascript
输入框跟随文字内容适配宽实现示例
Aug 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生成静态文件的多种方法分享
2012/07/17 PHP
php创建sprite
2014/02/11 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
让FireFox支持innerText的实现代码
2009/12/01 Javascript
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
简单的js计算器实现
2016/10/26 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
vue cli安装使用less的教程详解
2019/07/12 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
让python同时兼容python2和python3的8个技巧分享
2014/07/11 Python
分享Python文本生成二维码实例
2016/01/06 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
python去掉空白行的多种实现代码
2018/03/19 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
解决Python3中的中文字符编码的问题
2018/07/18 Python
python实现Zabbix-API监控
2018/09/17 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
vue中div禁止点击事件的实现
2022/04/02 Vue.js
教你nginx跳转配置的四种方式
2022/07/07 Servers