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 02 Javascript
Javascript中的变量使用说明
May 18 Javascript
JavaScript 一道字符串分解的题目
Aug 03 Javascript
jquery实现图片裁剪思路及实现
Aug 16 Javascript
js动态生成Html元素实现Post操作(createElement)
Sep 14 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
Mar 14 Javascript
无循环 JavaScript(map、reduce、filter和find)
Apr 08 Javascript
layui从数据库中获取复选框的值并默认选中方法
Aug 15 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
Aug 24 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
Oct 10 jQuery
JS根据Unix时间戳显示发布时间是多久前【项目实测】
Jul 10 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
Sep 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表单提交问题的解决方法
2011/04/12 PHP
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
php将数组存储为文本文件方法汇总
2015/10/28 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
2017/05/05 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
Python 实现简单的电话本功能
2015/08/09 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
python调用百度语音识别api
2018/08/30 Python
python pygame实现2048游戏
2018/11/20 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
python中实现栈的三种方法
2020/12/19 Python
公司新员工的演讲稿注意事项
2014/01/01 职场文书
建筑工程毕业生自我鉴定
2014/01/14 职场文书
铁路个人事迹材料
2014/01/30 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
遗失说明具结保证书
2015/02/26 职场文书
浅析MySQL如何实现事务隔离
2021/06/26 MySQL
Python的property属性详细讲解
2022/04/11 Python