在 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 的一个版本。
我对 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 的一个版本。