在 javascript 中使用构造函数调用函数

Function calling with constructors in javascript

我对 javascript 中的函数调用感到困惑,有人可以告诉我以下问题的答案吗?

**Question 1:**
function A(){


}


function A(){


}

A();

在这种情况下,将调用哪个函数?是第一个函数还是第二个函数?为什么?

**Question 2:**
function A(a){


}


function A(a,b){


}

A();

在这种情况下,将调用哪个函数?是第一个函数还是第二个函数?为什么?

提前致谢。

在这两种情况下,都会调用第二个函数,因为它会在声明时覆盖全局变量 A

类似于写作:

var a = 1;
var a = 2;

a === 2; // true

当解析器进入脚本时,它会搜索 var 语句和 function 声明,然后在当前范围(在您的情况下是全局范围)上创建这些变量。这种搜索和创建的过程称为提升。因此,在您解析第一个函数声明时的情况下。所以,类似的事情发生了:

scope.A = function A(){} // first function

然后解析器继续搜索并找到另一个函数声明。同样的事情发生了:

scope.A = function A(){} // second function

如您所见,scope.A 现在引用了第二个函数。

在这两种情况下都会调用第二个函数,因为您正在重新定义函数定义。

javascript 中也没有函数重载,在第二种情况下,更改函数签名(即它采用的参数)将重新定义相同的 A 函数(第一个定义)。

让我们付诸行动,看看结果:

function A(){
  var el = document.getElementById('test');
  el.innerText  = "First function";
}

function A(){
  var el = document.getElementById('test');
  el.innerText  = "Second function";
}

A();
<div id="test"></div>

正如我们所见,second 函数是赢家。为什么?因为当我们在第一次声明后再次写它时,我们只是覆盖它真的。

关于第二个问题:

function A(a){
  var el = document.getElementById('test');
  el.innerText  = "First function";
}

function A(a,b){
  var el = document.getElementById('test');
  el.innerText  = "Second function";
}

A();
<div id="test"></div>

我们看到,还是执行了第二题。那是因为 javascript 不是多态语言,也就是说,它不能像 java 那样有两个同名但输入声明不同的函数。我们只是做了与上面相同的事情:我们覆盖函数 A.

PS:如果 javascript 是一种多态语言(它不是),那么第二个 运行 会 return 一个错误,因为我们还没有t 声明了接收 0 个变量作为输入的函数 A 的一个版本。