JS两种定义方式的区别、内部原理


Posted in Javascript onNovember 21, 2013

相信两种方式大家都用过,但未必所有人都知道其 区别,内部原理。

// 方式1 
function func1(x,y){ 
// your code 
} 
// 方式2 
var func2 = function(x,y){ 
// your code 
}

方式1 是典型的函数声明(Function declarations)。
方式2 是函数表达式(Function expressions),将一个匿名函数赋值给一个变量。或者说方式2中创建了一个具有形参为x,y的匿名函数,然后把该匿名函数赋值给变量func2。

其主要区别在于:
1, 函数声明需显示的指定函数名,这里是func1;函数表达式则使用匿名函数
2, 方式1在代码执行之前(解释期)被加载到作用域中,方式2则需在代码执行时(运行期)加载

一个简单示例就明白了它们在使用上的区别

alert(func1); // --> func1源码 
alert(func2); // --> undefined 
// 方式1 
function func1(x,y){ 
// your code 
} 
// 方式2 
var func2 = function(x,y){ 
// your code 
}

可以看到,第一次弹出的是func1的源码,第二次却是undefined。即采用方式1(函数声明)定义函数,可以在该函数代码之上使用它,采用方式2(函数表达式)定义函数则不能在其定义前使用,只能在其定义后使用。

其内部涉及到 执行上下文(Execution context)及 激活对象(Activation object)。想更深了解的请阅读EcmaScript 5文档。

最近发现越来越多的人喜欢使用方式2定义函数,尤其在嵌套函数中。如单纯的定义一个函数个人还是习惯方式1。

Javascript 相关文章推荐
一个刚完成的layout(拖动流畅,不受iframe影响)
Aug 17 Javascript
jquery 多行滚动代码(附详细解释)
Jun 17 Javascript
鼠标移动到图片名上,显示图片的简单实例
Jul 14 Javascript
js怎么判断flash swf文件是否加载完毕
Aug 14 Javascript
JavaScript闭包函数访问外部变量的方法
Aug 27 Javascript
jquery利用拖拽方式在图片上添加热链接
Nov 24 Javascript
jquery插件jquery.confirm弹出确认消息
Dec 22 Javascript
Bootstrap Chart组件使用教程
Apr 28 Javascript
详解PHP中pathinfo()函数导致的安全问题
Jan 05 Javascript
js实现不提示直接关闭网页窗口
Mar 30 Javascript
小程序实现多选框功能
Oct 30 Javascript
vue单页应用的内存泄露定位和修复问题小结
Aug 02 Javascript
jQuery操作input值的各种方法总结
Nov 21 #Javascript
jqgrid 表格数据导出实例
Nov 21 #Javascript
js 实现菜单左右滚动显示示例介绍
Nov 21 #Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
Nov 21 #Javascript
JQuery的ready函数与JS的onload的区别详解
Nov 21 #Javascript
js 实现菜单上下显示附效果图
Nov 21 #Javascript
javascript 数组排序函数sort和reverse使用介绍
Nov 21 #Javascript
You might like
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
php header示例代码(推荐)
2010/09/08 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
Zend Framework教程之视图组件Zend_View用法详解
2016/03/05 PHP
PHP7下协程的实现方法详解
2017/12/17 PHP
PHP中的self关键字详解
2019/06/23 PHP
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
2017/01/08 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
Flask Web开发入门之文件上传(八)
2018/08/17 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
Python Selenium参数配置方法解析
2020/01/19 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
澳大利亚排名第一的在线酒类商店:MyBottleShop
2018/04/26 全球购物
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
会计电算化毕业生自荐信
2014/03/03 职场文书
4s店活动策划方案
2014/08/25 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
安全员岗位职责
2015/02/10 职场文书
事业单位个人总结
2015/02/12 职场文书
反腐倡廉观后感
2015/06/08 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
MySQL实现配置主从复制项目实践
2022/03/31 MySQL