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编程起步(第二课)
Feb 27 Javascript
JavaScript类和继承 constructor属性
Mar 04 Javascript
jquery自定义函数的多种方法
Jan 09 Javascript
jQuery随机密码生成的方法
Mar 09 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
Mar 24 Javascript
js css实现垂直方向自适应的三角提示菜单
Jun 26 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
May 12 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
Jan 23 Javascript
webpack 单独打包指定JS文件的方法
Feb 22 Javascript
javascript高仿热血传奇游戏实现代码
Feb 22 Javascript
vue 点击按钮实现动态挂载子组件的方法
Sep 07 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
Mar 04 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脚本数据库功能详解(中)
2006/10/09 PHP
php数组总结篇(一)
2008/09/30 PHP
PHP实现图片裁剪、添加水印效果代码
2014/10/01 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
jQuery学习笔记之Ajax用法实例详解
2015/12/01 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
python查找指定具有相同内容文件的方法
2015/06/28 Python
python连接字符串的方法小结
2015/07/13 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
浅析Python数据处理
2018/05/02 Python
查看python下OpenCV版本的方法
2018/08/03 Python
django admin 添加自定义链接方式
2020/03/11 Python
Python:__eq__和__str__函数的使用示例
2020/09/26 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
canvas探照灯效果的示例代码
2018/11/30 HTML / CSS
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
应届生幼儿园求职信
2013/11/12 职场文书
营销总经理的岗位职责
2013/12/15 职场文书
活动宣传策划方案
2014/05/23 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技
Python日志模块logging用法
2022/06/05 Python
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android