Javascript:函数表达式超过函数声明

时间:2014-10-10 11:54:04

标签: javascript function

我有两个函数名称 init

一个使用函数声明声明,另一个声明使用函数表达式,如下所示:

function init() {
    alert ('init 1'); 
}

var init = function(){
    alert('init 2');
}

init();

当我调用init函数时,它会警告init 2。

Demo

我的问题是:

1-为什么javascript不会抛出错误,因为两个函数都有相同的名称。

2-如何调用第一个函数?

6 个答案:

答案 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不会抛出错误,因为重新定义函数通常很有用。