如果函数尚未定义,那么定义函数的安全方法是什么

时间:2014-10-27 09:11:39

标签: javascript google-chrome firefox

我有一些像这样的代码,如果它还没有被定义,它会尝试定义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;
}

但我重视其他任何想法,或者我可以阅读的一些文档。

3 个答案:

答案 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");
    }
}

哪个应该解决悬挂问题。

请确保牢记范围。