javascript - JavaScript 中没有重载的概念

标签 javascript overloading

检查这个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/

相关文章:

c# - 将数组传递给采用参数 object[] 或 IEnumerable<T> 的函数

c++ - 重载运算符 >> 和 << 以便它接受用户定义的对象

c++ - 编译器无法解析通过 std::mem_fn 传递的匹配类方法

javascript - 如何获取刚刚创建的用户的uId

html - 返回 JS 函数的值并将其用作输入按钮的值

java - 从 List<Integer> 中正确删除 Integer

c++ - 模板函数重载和 SFINAE 实现

php - 当您回答问题并且有人提交了另一个答案时,stackoverflow 上显示的弹出警报是如何创建的?

javascript - Mapbox 搜索,打开弹出窗口/工具提示并更改自定义标记图像

javascript - 在单个页面的多个位置使用时,JQuery 插件不起作用