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 Discuz代码中的msn聊天小功能
May 25 Javascript
jQuery中获取Radio元素值的方法
Jul 02 Javascript
JavaScript实现大数的运算
Nov 24 Javascript
Javascript的表单验证-初识正则表达式
Mar 18 Javascript
使用 bootstrap modal遇到的问题小结
Nov 09 Javascript
详解vue中使用express+fetch获取本地json文件
Oct 10 Javascript
前后端如何实现登录token拦截校验详解
Sep 03 Javascript
js单线程的本质 Event Loop解析
Oct 29 Javascript
使用Vue 自定义文件选择器组件的实例代码
Mar 04 Javascript
VSCode 配置uni-app的方法
Jul 11 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
Aug 06 Javascript
vue style width a href动态拼接问题的解决
Aug 07 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
PHP实现多服务器session共享之NFS共享的方法
2007/03/16 PHP
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
PHP里的中文变量说明
2011/07/23 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
JS实现手风琴特效
2020/11/08 Javascript
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
详解python调用cmd命令三种方法
2019/07/08 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
详解python中的异常和文件读写
2021/01/03 Python
波兰购物网站:MALL.PL
2019/05/01 全球购物
Hammitt官网:设计师手袋
2020/05/23 全球购物
客户服务经理岗位职责
2014/01/29 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
2015团员个人年度总结
2015/11/24 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android