我对javascript中的函数调用感到困惑,有人可以告诉下面的问题答案吗?
:target
在这种情况下,哪个函数会调用?是第一个还是第二个函数?为什么?
**Question 1:**
function A(){
}
function A(){
}
A();
在这种情况下,哪个函数会调用?是第一个还是第二个函数?为什么?
提前致谢。
答案 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
现在引用第二个功能。