我看到其他人使用了以下模式。
var bar = function foo(){};
console.log(bar); // foo()
console.log(foo); // ReferenceError: foo is not defined
但为什么呢?如果两者都被声明了,我可以理解,但它们并没有。原因是什么?
我看到其他人使用了以下模式。
var bar = function foo(){};
console.log(bar); // foo()
console.log(foo); // ReferenceError: foo is not defined
但为什么呢?如果两者都被声明了,我可以理解,但它们并没有。原因是什么?
当调试应用程序时,如果使用"命名"匿名函数,可以更容易地了解调用堆栈中的内容。因此,这是为了调试目的给匿名函数赋予名称的一种方式。
尝试这个并在调试器中查看调用堆栈:
myDiv = document.getElementById("myDiv");
myDiv.onclick = function OnClick(){
debugger;
//do something
}
var foo = function bar() {};
本身肯定是有问题的。此外,DOM0事件处理程序属性(例如myDiv.onclick = function() {};
)在IE中可以正常工作。我想你可能在考虑setAttribute()
(例如myDiv.setAttribute("onclick", "alert('click')");
),这在旧版IE中确实存在问题。 - Tim Downname
属性。请尝试此操作:var bar = function foo(){};
console.log(bar.name); // foo
如果你在foo函数中加入一些实际的代码,并在浏览器的JavaScript调试器中添加断点,你将会在调用栈中看到该函数名为foo
。
他们给一个匿名函数命名是因为这样更容易调试。在调试时,你会看到调用堆栈中的“foo”而不是一堆“anonymous”的调用。
函数定义(或文字)由4个部分组成。1.保留字function
2.可选名称,调试器或函数可以使用它来递归调用自身。3.参数和4.函数体,由{ }
包装。
在函数范围之外,foo不存在。但是,由于将函数分配给变量bar,因此可以使用方法调用bar调用它,并且由于定义了bar,因此可以打印它。
如果您对JavaScript感兴趣,真的应该考虑获取Douglas Crockford的书Javascript:The Good Parts。