浅析JS中对函数function的理解(基础篇)


Posted in Javascript onOctober 14, 2016

正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法。因此,函数名实际上是指向函数对象的指针,不与某个函数绑定。在常见的两种定义方式(见下文)之外,还有一种定义的方式能更直观的体现出这个概念:

var sum = new Function("num1", "num2", "return num1 + num2"); //不推荐

Function的构造函数可以接收任意数量的参数,但最后一个参数始终被看做函数体。这种方式有个缺点是,会导致解析两次代码,第一次是基础的ES代码解析,第二次是解析传入构造函数中的字符串,这样会导致性能的下降,在此写出是帮助理解js中函数其实是对象这个概念。

 (一)js函数没有重载的概念

说到重载的概念,我们来类比Java中的重载是怎么实现的:在Java中,方法是通过方法签名来唯一标识一个方法。方法签名包括:方法名、参数数量、参数顺序和参数类型这几个要素。因此两个方法的方法名相同,而其他签名要素不同,编译器就会认为是两个不同方法,从而可以存在同名的不同方法,以实现重载的概念。(引用:怎么深入理解js中为什么没有重载呢--segmentfault 中manxisuo的回答)。

而上面我们说过,js中的函数名实际上是指向函数对象的指针,因此函数名可以说是一个函数的唯一标识,跟参数列表并没有关系,因此并不会出现同名的两个函数(因为一个指针同时只能指向一个对象)从而不存在重载的概念。 举个栗子:

function sum(num1, num2){
return num1 + num2;
}
function sum(num1, num2, num3){
return num1 + num2 + num3;
}

上面这种可以换一种写法,会更直观一些:

var sum = function(num1, num2){
return num1 + num2;
}
sum = function(num1, num2, num3){
return num1 + num2 + num3;
}

这样就很明显可以看出,上面一行将sum指向function(num1,num2),而接下来又将sum指向function(num1, num2, num3),从而造成第二次的指向覆盖了第一次的,因此更明显的看出js中并没有重载的概念。

(二)函数声明和函数表达式的区别

我们知道,常用的定义函数方法有两个:函数声明和函数表达式。

函数声明,可以说是最常见的定义方法,如下例:

function sum(num1, num2){
return num1 + num2;
}

函数表达式,这种定义方式在闭包及一些框架中使用较多,例如angular中常见的$scope.doSomething = function(){...}:

sum = function(num1, num2){
return num1 + num2;
};

上述两种定义方法几乎是相同的,但有一点小区别,请看下面这个例子:

//函数声明
alert(sum(100, 100));
function sum(num1, num2){
return num1 + num2;
}
//函数表达式
alert(sum(100, 100));
var sum = function(num1, num2){
return num1 + num2;
};

这两段代码看起来差别不大,只是函数定义的方式不同而已。但事实是,第一段可以正常运行而第二段则会报错。这是因为,在代码开始执行之前,解析器就已经通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境中。简单来说,解析器会先将函数声明放在源代码树的顶部。而下面那段代码,函数位于一个初始化语句中(并不会将其提升到顶部),简单来说,在执行到这个赋值语句之前,sum并未指向任何一个函数,因此在之前调用函数则会报错。

以上所述是小编给大家介绍的JS中函数function的理解(基础篇),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript window对象属性整理
Oct 24 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
Jul 20 Javascript
jQuery实现表头固定效果的实例代码
May 24 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
Oct 09 Javascript
JS实现跟随鼠标闪烁转动色块的方法
Feb 26 Javascript
JS简单获取及显示当前时间的方法
Aug 03 Javascript
javascript实现数据双向绑定的三种方式小结
Mar 09 Javascript
Angular之toDoList的实现代码示例
Dec 02 Javascript
详解JavaScript实现动态的轮播图效果
Apr 29 Javascript
js prototype和__proto__的关系是什么
Aug 23 Javascript
JQuery中的常用事件、对象属性与使用方法分析
Dec 23 jQuery
vue 里面的 $forceUpdate() 强制实例重新渲染操作
Sep 21 Javascript
js插件Jcrop自定义截取图片功能
Oct 14 #Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
Oct 14 #Javascript
Js动态设置rem来实现移动端字体的自适应代码
Oct 14 #Javascript
JS动态计算移动端rem的解决方案
Oct 14 #Javascript
javascript对浅拷贝和深拷贝的详解
Oct 14 #Javascript
jQuery web 组件 后台日历价格、库存设置的代码
Oct 14 #Javascript
第一次接触神奇的Bootstrap
Oct 14 #Javascript
You might like
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
php ftp文件上传函数(基础版)
2010/06/03 PHP
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
PHP中把对象转换为关联数组代码分享
2015/04/09 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
javascript中关于&& 和 || 表达式的小技巧分享
2015/04/10 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
js实现定时进度条完成后切换图片
2017/01/04 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
使用vue-cli编写vue插件的方法
2018/02/26 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
Python subprocess模块详细解读
2018/01/29 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
Python tkinter之ComboBox(下拉框)的使用简介
2021/02/05 Python
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
车间统计员岗位职责
2014/01/05 职场文书
学生周末长期请假条
2014/02/15 职场文书
老师对学生的寄语
2014/04/09 职场文书
家长给学校的建议书
2014/05/15 职场文书
公证处委托书
2015/01/28 职场文书
毕业生党员个人总结
2015/02/14 职场文书
毕业实习单位意见
2015/06/04 职场文书