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 相关文章推荐
DIY jquery plugin - tabs标签切换实现代码
Dec 11 Javascript
js获取电脑分辨率的思路及操作
Nov 22 Javascript
通过JS判断联网类型和连接状态的实现代码
Apr 01 Javascript
javascript判断firebug是否开启的方法
Nov 23 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
Nov 14 Javascript
Vue+Vux项目实践完整代码
Nov 30 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
May 08 Javascript
记一次webpack3升级webpack4的踩坑经历
Jun 12 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
Jul 10 Javascript
对vue中v-if的常见使用方法详解
Sep 28 Javascript
JavaScript实现打砖块游戏
Feb 25 Javascript
vue3.0搭配.net core实现文件上传组件
Oct 29 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 if 想到的些问题
2008/03/22 PHP
PHP获取url的函数代码
2011/08/02 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
2014/04/23 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
JavaScript实现多种排序算法
2016/02/24 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
2016/12/27 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
HTML+JavaScript实现扫雷小游戏
2019/09/30 Javascript
如何利用nodejs自动定时发送邮件提醒(超实用)
2020/12/01 NodeJs
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
简单实现python进度条脚本
2017/12/18 Python
用python简单实现mysql数据同步到ElasticSearch的教程
2018/05/30 Python
python多进程使用及线程池的使用方法代码详解
2018/10/24 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
python编写一个会算账的脚本的示例代码
2020/06/02 Python
python Cartopy的基础使用详解
2020/11/01 Python
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
美国滑雪板和装备购物网站:Skis.com
2018/12/20 全球购物
求职信的要素有哪些呢
2013/12/26 职场文书
职业生涯规划怎么写
2013/12/29 职场文书
酒店拾金不昧表扬信
2014/01/18 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
mysql 索引合并的使用
2021/08/30 MySQL