检查这个fiddle或以下代码:
function abc(s) {
console.log('in abc(s)');
}
function abc(s, t) {
console.log('in abc(s,t)');
}
abc('1');
这道题的输出总是in abc(s,t)
有人可以向我解释这里发生了什么以及为什么吗?
最佳答案
在 Javascript 中没有重载的概念。
不过,您可以编写一个函数,使用 arguments
值检查传递了多少参数。
function foo(s, t) {
if (arguments.length == 2) {
...
} else {
...
}
}
函数在签名中期望但调用者未传递的所有参数都将作为 undefined
接收。您还可以通过简单地访问用 arguments[i]
传递的第 n 个参数来编写可变参数函数。但是请注意,arguments
不是 Javascript 数组,因此并非所有数组方法都适用。
关于能够多次重新定义同一个函数而不会出错的事情解释起来有点复杂,因为规则很奇怪。
一个简单的解释是你可以想到的是 function
是一个可执行语句,就像在 Python 中一样,所以最后一个函数定义获胜。然而,这是错误的,因为与 Python 不同,以下是合法的 Javascript 代码:
console.log(square(12));
function square(x) { return x*x; }
即您可以在定义之前的行中调用函数(在脚本中:当然,在 Javascript 控制台中输入这两行是行不通的)。
稍微正确一点的解释是,编译器先解析所有的函数定义(最后胜出),然后开始执行代码。如果您不将 function
放在 if
中,这种心智模型就会起作用,因为在这种情况下实际发生的情况取决于实现(我不是在谈论疯狂的 IE,但即使是 FF 和 Chrome 也会做不同的事情)。只是不要那样做。
你甚至可以使用表单
var square = function(x) { return x*x; }
在这种情况下,它是一个简单的“函数表达式”赋值给一个变量,该变量在流通过它时执行(因此可以将函数的不同实现放在不同的 if
中分支,但在为其分配实现之前不能调用该函数)。
关于javascript - JavaScript 中没有重载的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23320410/