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

时间:2016-09-26 05:53:42

标签: javascript function-calls

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

:target

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

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


}


function A(){


}

A();

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

提前致谢。

4 个答案:

答案 0 :(得分:5)

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

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>

正如我们所看到的,第二功能是赢家。为什么?因为当我们在第一次声明之后再次写它时,我们只是覆盖

至于第二个问题:

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是一种多态语言(它不是),那么第二次运行会返回一个错误,因为我们没有声明一个接收0个变量作为输入的函数A的版本。

答案 1 :(得分:2)

在两种情况下都会调用第二个函数,作为重新定义函数定义的函数。

在javascript中也没有函数重载,在第二种情况下,更改函数签名(即它需要的参数)将重新定义相同的A函数(定义为1st)。

答案 2 :(得分:0)

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

这与写作类似:

var a = 1;
var a = 2;

a === 2; // true

答案 3 :(得分:0)

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

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

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

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

如您所见,scope.A现在引用第二个功能。