咸鱼的星空 2019-03-01
对于很多刚从Java学习过渡到JavaScript学习的同学来说在定义方法的问题上最头疼,我们Java人员来学习JavaScript是非常容易上手的,因为语法大部分都相同。但是定义方法是个例外,JavaScript中没有方法重载的概念,匹配方法只去比较方法名,这跟Java大相径庭。今天我们来剖析一下这个问题, 既然JavaScript中没有重载的概念,那么我们定义两个方法名相同的方法,会出现什么问题呢?
<script >
function calc(a , b){
alert(a + b);
}
calc(1,2);
function calc() {
alert("空参方法");
}
calc();
</script>
这里一执行会弹出两个空参方法,而不是一个3和一个空参方法。
这是因为在JavaScript中如果定义的方法名相同,下面的会将上面的覆盖掉。
以上是具名方法声明的方法,我们如果用具名和匿名方法分别声明相同的方法名的方法会是一种什么样的情况呢?
<script >
function calc(a , b){
alert(a + b);
}
calc(1,2);
var calc = function(){
alert("空参方法");
}
calc();
</script>
出乎我们意料,竟然弹了个3又弹了个空参方法,好像互相不影响。
那请看下面这种情况:
<script >
function calc(a , b){
alert(a + b);
}
calc(1,2);
var calc = function(){
alert("空参方法");
}
calc();
function calc(a , b){
alert(a - b);
}
calc(1,2);
</script>
为什么会是这样一个顺序呢?第三个方法会将第一个方法覆盖掉,这个现象大家能理解。 但为什么第二个方法会将第三个方法覆盖掉呢?
是因为匿名方式声明的方法。只有在调用的时候才真正的被加载上。而具名方法在加载之前就会将相同的方法覆盖掉。所以在加载之前第三个方法会将第一个方法覆盖掉。所以先弹出了一个"-1"/接着执行到了匿名方法。也就是第二个方法。这时候这个方法才加载到内存中。所以会将已经加载好的第三个方法覆盖掉。