我编写以下脚本只是为了看看当一个变量和一个分配了函数的函数的名称冲突时会发生什么:
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
。有人能解释一下吗?
发布于 2014-05-27 20:24:22
函数声明在JavaScript中被提升(移到顶部)。虽然在解析顺序方面不正确,但您拥有的代码在语义上与以下代码相同,因为函数声明是提升的:
function f() {
console.log("Me duplicate.");
}
var f = function() {
console.log("Me original.");
}
f();
反过来,除了函数的名称与以下名称相同之外:
var f = function() {
console.log("Me duplicate.");
}
var f = function() {
console.log("Me original.");
}
f();
反过来,由于变量提升,它与:
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中函数的神秘面纱方面做了一件奇妙的工作。
发布于 2014-06-04 03:10:14
如果看起来没有人回答你的后续问题,所以我将在这里回答它,尽管您通常应该将后续问题作为单独的问题来问。
你问为什么会这样:
var f = new function() {
console.log("Me original.");
}
function f() {
console.log("Me duplicate.");
}
f();
打印出"Me original“然后是一个错误。
这里发生的事情是,new
导致函数被用作构造函数。因此,这相当于以下内容:
function myConstructor() {
console.log("Me original.");
}
var f = new myConstructor();
function f() {
console.log("Me duplicate.");
}
f();
多亏了本杰明解释的函数提升,上面的基本上等同于:
var myConstructor = function() {
console.log("Me original.");
};
var f = function() {
console.log("Me duplicate.");
};
f = new myConstructor();
f();
此表达式:
var f = new function() {
console.log("Me original.");
}
使用匿名函数作为构造函数,导致构造新对象并将其分配给f
。“我是原创的”在构造函数执行时打印出来。但是构造的对象本身并不是一个函数,所以当这个函数最终执行时:
f();
你会得到一个错误,因为f
不是一个函数。
https://stackoverflow.com/questions/23889317
复制相似问题