我有两个函数名称 init
一个使用函数声明声明,另一个声明使用函数表达式,如下所示:
function init() {
alert ('init 1');
}
var init = function(){
alert('init 2');
}
init();
当我调用init函数时,它会警告init 2。
我的问题是:
1-为什么javascript不会抛出错误,因为两个函数都有相同的名称。
2-如何调用第一个函数?
答案 0 :(得分:3)
为什么javascript不会抛出错误,因为两个函数都有相同的名称。
他们没有相同的名字。第二个是包含匿名函数的变量init
。第一个是名为init
的函数。
您可以通过在以下两者上执行以下操作来测试:
console.log(init.name);
你会看到第一个确实有一个名字init
,而第二个没有名字。
我如何调用第一个函数?
在此示例中,第二次使用init
变量后,无法调用第一个变量。除非你对第一个有另外的引用,如下:
function init() {
alert ('init 1');
}
var original = init;
答案 1 :(得分:2)
你在做什么和
之间没有根本的不同var i = 1;
var i = 2;
不,JS不会抛出错误,不会,一旦你重新定义i
,你就无法获得旧值。
在ES6和一些现代浏览器中,您可以说
const i = 1;
如果重新定义,引擎会抱怨。
答案 2 :(得分:2)
JavaScript中的声明已悬挂。函数声明是声明的一种类型。因此,您的计划相当于:
var init = function init() {
alert("init 1");
};
var init = function () {
alert("init 2");
};
init();
如果您在第二个定义之前致电init
,则会提醒init 1
:
function init() {
alert("init 1");
}
init();
var init = function () {
alert("init 2");
};
由于提升,您甚至可以在程序出现之前致电init
:
init();
function init() {
alert("init 1");
}
var init = function () {
alert("init 2");
};
请记住,无论它们出现在程序中的顺序如何,函数声明始终是第一位的:
init();
var init = function () {
alert("init 2");
};
function init() {
alert("init 1");
}
希望有所帮助。
答案 3 :(得分:0)
Javascript获取函数的最后一个定义。 您可以将其重命名为唯一,或者您可以使用严格的#34;使它成为本地功能。
function functions(){
"use strict"
var init = function(){
console.log("b");
};
return {
start : init
}
};
var fn = new functions();
fn.start();
答案 4 :(得分:0)
你可以制作一种命名空间:
var p1 = {
init: function() {
alert('init 1');
}
};
var p2 = {
init: function() {
alert('init 2');
}
};
var init = function() {
p1.init();
p2.init();
};
init();

Running ...

答案 5 :(得分:0)
这有效:
function init() {
alert ('init 1');
}
var init = (function(oldInit) { return function() {
oldInit(); // Call the first definition this way
alert('init 2');
}; })(init);
init();
诀窍是让第二个init()记住前一个init。 Javascript不会抛出错误,因为重新定义函数通常很有用。