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 相关文章推荐
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
Mar 20 Javascript
利用javascript实现全部删或清空所选的操作
May 27 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
Jun 10 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
Mar 25 Javascript
JavaScript常用标签和方法总结
Sep 01 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
May 12 Javascript
js将json格式的对象拼接成复杂的url参数方法
May 25 Javascript
vue实现移动端图片裁剪上传功能
Aug 18 Javascript
详解如何webpack使用DllPlugin
Sep 30 Javascript
vue watch关于对象内的属性监听
Apr 22 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
Sep 10 Javascript
javascript实现随机抽奖功能
Dec 30 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
thinkphp 多表 事务详解
2013/06/17 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
探究python中open函数的使用
2016/03/01 Python
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
在Python中定义一个常量的方法
2018/11/10 Python
linux安装python修改默认python版本方法
2019/03/31 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
python实现的生成word文档功能示例
2019/08/23 Python
Python Selenium参数配置方法解析
2020/01/19 Python
python 使用OpenCV进行简单的人像分割与合成
2021/02/02 Python
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
C#基础面试题
2016/10/17 面试题
国家助学金获奖感言
2014/01/31 职场文书
协议书样本
2014/04/23 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
奠基仪式致辞
2015/07/30 职场文书
Python jiaba库的使用详解
2021/11/23 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python