首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我的JavaScript函数名称冲突?

为什么我的JavaScript函数名称冲突?
EN

Stack Overflow用户
提问于 2014-05-27 20:21:27
回答 2查看 10.3K关注 0票数 97

我编写以下脚本只是为了看看当一个变量和一个分配了函数的函数的名称冲突时会发生什么:

代码语言:javascript
复制
var f = function() {
    console.log("Me original.");
}

function f() {
    console.log("Me duplicate.");
}

f();

我得到的输出是“我的原创”。为什么另一个函数没有被调用?

此外,如果我将原始任务更改为var f = new function() {,我会得到"Me original",后跟一个TypeError,显示为object is not a function。有人能解释一下吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-27 20:24:22

函数声明在JavaScript中被提升(移到顶部)。虽然在解析顺序方面不正确,但您拥有的代码在语义上与以下代码相同,因为函数声明是提升的:

代码语言:javascript
复制
function f() {
    console.log("Me duplicate.");
}
var f = function() {
    console.log("Me original.");
}


f();

反过来,除了函数的名称与以下名称相同之外:

代码语言:javascript
复制
var f = function() {
    console.log("Me duplicate.");
}
var f = function() {
    console.log("Me original.");
}


f();

反过来,由于变量提升,它与:

代码语言:javascript
复制
var f;
f = function() {
    console.log("Me duplicate.");
}
f = function() {
    console.log("Me original.");
}

f();

这就解释了你得到了什么,你覆盖了这个函数。更普遍的是,JavaScript中允许多个var声明-- var x = 3; var x = 5是完全合法的。在新的ECMAScript 6标准中,let语句禁止这样做。

@kangax的This article在揭开javascript中函数的神秘面纱方面做了一件奇妙的工作。

票数 170
EN

Stack Overflow用户

发布于 2014-06-04 03:10:14

如果看起来没有人回答你的后续问题,所以我将在这里回答它,尽管您通常应该将后续问题作为单独的问题来问。

你问为什么会这样:

代码语言:javascript
复制
var f = new function() {
    console.log("Me original.");
}

function f() {
    console.log("Me duplicate.");
}

f();

打印出"Me original“然后是一个错误。

这里发生的事情是,new导致函数被用作构造函数。因此,这相当于以下内容:

代码语言:javascript
复制
function myConstructor() {
    console.log("Me original.");
}
var f = new myConstructor();

function f() {
    console.log("Me duplicate.");
}

f();

多亏了本杰明解释的函数提升,上面的基本上等同于:

代码语言:javascript
复制
var myConstructor = function() {
    console.log("Me original.");
};
var f = function() {
    console.log("Me duplicate.");
};

f = new myConstructor();

f();

此表达式:

代码语言:javascript
复制
var f = new function() {
    console.log("Me original.");
}

使用匿名函数作为构造函数,导致构造新对象并将其分配给f。“我是原创的”在构造函数执行时打印出来。但是构造的对象本身并不是一个函数,所以当这个函数最终执行时:

代码语言:javascript
复制
f();

你会得到一个错误,因为f不是一个函数。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23889317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档