您的位置:首页 > 其它

关于ECMAScript中没有重载、函数签名、解析器的理解

2018-03-11 23:00 127 查看
最近开始重新开始被誉为前端经典书籍——《JavaScirpt高级程序设计(第三版)》学习,突然找到一些比较重要的知识点,以下做点总结:
1.ECMAScript中没有重载
严格来说是没有传统意义上那样实现的重载。像Java等语言中,可以为一个函数编写两个定义,只要这两个函数的定义的签名(接受的参数的类型和数量)不同即可实现。那么,为什么JavaScirpt中没有重载呢?
要了解这个,还要从ECMAScirpt的参数开始说起,大家都知道JavaScript是一门松散的语言,它的函数的参数自然就有可能另类了,那么,怎么样另类法呢?在ECMAScript函数中不会介意传递函数参数的个数和类型,这就表明,即使你定义了两个参数,但是传递进来的参数未必一定要是两个!!!也就是说,在调用的时候可以没有或者多于2个,这归功于解析器的强大功能,下面举个例子吧:<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
window.onload=function(){
function sayHi(name1,name2){
alert("hello"+","+name1+","+name2);
}
sayHi("liming","Alice","Mike");
sayHi("Landa","Jake");
}
</script>
</head>
<body>

</body>
</html>效果截图:





这就表示了传入的参数的确可以有多个!
其实,真正的原因是ECMAScript中的参数在内部是用一个数组来表示的,在函数体内可以通过arguments对象来访问这个参数数组,从而获得传递给函数的每一个参数。然而arguments对象并不是数组,而是跟数组类似,貌似不懂可以怎样验证,这个之后再深究吧~
既然类似于数组,那么就可以通过arguments.length来获取传递进来的参数的个数,还可以通过arguments[0]来获取传递进来的第一个参数。既然传递进来的参数的个数可以不定,又可以类型不同,那么就没有所谓的重载了,即使定义了两个函数名相同的函数,也会直接覆盖。
实现获取参数个数和使用argument[下标]来获取传入参数的例子:<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
window.onload=function(){
function howManyArgs(){
console.log(arguments.length);
}
howManyArgs("string",45);
howManyArgs();
howManyArgs(12);
}
</script>
</head>
<body>

</body>
</html>结果截图:



<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
window.onload=function(){
function sayHi(name1,name2){
alert("hello"+","+arguments[0]+","+arguments[1]);
}
sayHi("liming","Alice","Mike");
sayHi("Landa","Jake");
}
</script>
</head>
<body>
</body>
</html>效果跟第一个例子也是相同的:





那么这样做可以有什么用呢?
我感觉从书上的例子来体会,就是可以通过传入参数个数的不同来做不同的处理吧,下面是书中的例子:<script>
window.onload=function(){
function doAdd(num1,num2){
if(arguments.length==1){
alert(num1+10);
}else if(arguments.length==2){
alert(arguments[0]+num2);
}
}
}
</script>关于arguments,还需要注意的是,它的值永远是与对应命名参数的值保持同步的

2.什么是函数签名?
3.什么是解析器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: