我有一些像这样的代码,如果它还没有被定义,它会尝试定义foobar
:
if (!foobar) {
function foobar() {
alert("hello from foobar");
}
}
在该块之外调用foobar
适用于Chrome,但不适用于Firefox(请参阅http://jsbin.com/kifeticesa/1/edit?html,js,output - Firefox会给我一个ReferenceError
,我认为因为声明提升 - 这显然是{{ 3}})。
我认为更好的写作方式是:
function foobar_impl() {
alert("hello from foobar");
}
if ('foobar' == typeof window.noFunc) {
var foobar = foobar_impl;
}
但我重视其他任何想法,或者我可以阅读的一些文档。
答案 0 :(得分:3)
这看似相当惯用:
var foobar = foobar || function() {
/*...*/
};
答案 1 :(得分:1)
试试这个:
if (!window.foobar) {
window.foobar = function() {
alert("hello from foobar");
}
}
foobar(); // alerts "hello from foobar"
答案 2 :(得分:1)
在实施polyfill之前,先了解MDN如何检查函数:
if (!Array.prototype.forEach) {
Array.prototype.forEach = function <...>
<子> Source 子>
这几乎相当于:
if (!window.foobar) {
window.foobar = function() {
alert("hello from foobar");
}
}
哪个应该解决悬挂问题。
请确保牢记范围。