浅析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 相关文章推荐
等待指定时间后自动跳转或关闭当前页面的js代码
Jul 09 Javascript
Jquery Validate 正则表达式实用验证代码大全
Aug 23 Javascript
jquery选择器使用详解
Apr 08 Javascript
js换图片效果可进行定时操作
Jun 09 Javascript
jQuery截取指定长度字符串的实现原理及代码
Jul 01 Javascript
Javascript之Date对象详解
Jun 07 Javascript
AngularJS 基础ng-class-even指令用法
Aug 01 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
Jan 04 Javascript
js canvas实现QQ拨打电话特效
May 10 Javascript
简单谈谈原生js的math对象
Jun 27 Javascript
JavaScript相等运算符的九条规则示例详解
Oct 20 Javascript
vue+element ui实现锚点定位
Jun 29 Vue.js
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
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
JavaScript中的6种运算符总结
2014/10/16 Javascript
Javascript基础教程之函数对象和属性
2015/01/18 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
Sort()函数的多种用法
2016/03/20 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
js数组去重的hash方法
2016/12/22 Javascript
React Router基础使用
2017/01/17 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
python生成器的使用方法
2013/11/21 Python
Python中的闭包总结
2014/09/18 Python
举例介绍Python中的25个隐藏特性
2015/03/30 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
python如何从键盘获取输入实例
2020/06/18 Python
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
通报表扬范文
2015/01/17 职场文书
公司门卫岗位职责
2015/04/13 职场文书
创业计划书之儿童理发店
2019/09/27 职场文书
python的html标准库
2022/04/29 Python