如何在javascript中有条件地定义函数?

如何在javascript中有条件地定义函数?,javascript,Javascript,考虑以下脚本: if (false)​ { function foo() { alert("FOO"); } } foo(); // alerts "FOO" 如您所见,函数foo已定义,即使if的条件失败,该函数仍然有效 我想这样做的原因是,我正在为InDesign开发一个扩展,我制作了一个名为utilities.jsx的脚本,其中包含了其他脚本中使用的各种函数。在所有需要这些函数的脚本中,我只使用: app.doScript(File(scriptsFile

考虑以下脚本:

if (false)​ {
    function foo() {
        alert("FOO");
    }
}
foo(); // alerts "FOO"
如您所见,函数
foo
已定义,即使
if
的条件失败,该函数仍然有效

我想这样做的原因是,我正在为InDesign开发一个扩展,我制作了一个名为utilities.jsx的脚本,其中包含了其他脚本中使用的各种函数。在所有需要这些函数的脚本中,我只使用:

app.doScript(File(scriptsFile.parent.fsName + "/t_utilities.jsx"), ScriptLanguage.JAVASCRIPT);
它定义了我需要的所有函数,然后我就可以使用它们了。现在,由于该脚本将被各种文件以不可预测的顺序多次调用(由用户决定),因此我认为只有在函数之前没有定义的情况下(如果utilities.jsx还没有运行),我才可能定义这些函数。有点像php中的
require_once

我曾考虑过以下类似的方法,但这不起作用,因为每次运行脚本时都会定义函数:`

var utilitiesHasRun;
if (utilitiesHasRun !== true) {
  // define all the functions
  // ...
  utilitiesHasRun = true;
}

还有其他选项吗?

您可以将其设置为函数表达式,而不是函数声明:

注意,在上面的代码中,
foo
仍然可以访问,即使条件的计算结果为false。这是因为函数范围的声明(函数和
var
)被提升到声明它们的范围的顶部。但是,赋值发生在代码中它们出现的位置

上述代码有效地实现了以下功能:

var foo; //No assignment, foo is undefined
if (false)​ {
    foo = function () {
        alert("FOO");
    };
}
foo(); //TypeError: undefined is not a function

警告Internet Explorer 8及以下版本中仍挂起命名函数表达式(这是IE中的一个错误)。显然,如果您需要支持旧浏览器,这只是一个潜在问题。

您可以根据需要使用函数指针重新分配函数

var myFunctionPointer = function { alert("Default"); };
if (condition) {
    myFunctionPointer = function { alert("true"); };
}
else {
    myFunctionPointer = function { alert("false"); };
}
myFunctionPointer();

为确保之前未定义功能,请使用:

if ( typeof yourFunctionName == 'undefined' ) {
  yourFunctionName = function( params ) {
    // your code here
  };
}

通常,我基于一个函数创建一个完整的API,该函数返回一个对象,其中包含最终调用次要JS函数的方法。扩展可以与嵌入类的JS文件交互。我想我给了你烹饪书的链接。因此,您可以在AS3中声明一个对象,并检查一些属性,如:

public var jsAPI:Object = {};
js代码将是

var jsAPI = function() {
    return {
        hasBeenLoaded:false,
        myMethod1:function(){},
    }
}
然后,如果需要在AS3中使用JS函数,可以检查一些标志,如:

if ( jsAPI.hasBeenLoaded ){ … }
else { //loads the API via new API() }

您的第一个代码段在技术上无效,因为块中不允许函数声明。它之所以有效,是因为所有主流浏览器都实现了对ECMAScript规范的扩展来处理这种情况。为了继续@TimDown的评论,如果第一个代码片段是严格模式代码的一部分,那么它实际上会抛出一个语法错误。+1:非常简洁。我没有意识到函数声明仍然挂起,以为这只是函数表达式,但现在我看到了细微的区别+1啊,起重。谢谢你的解释。我选择了Sirko的答案,因为它不会产生错误,但是如果您只是将对foo(
foo()
)的调用粘贴在一个try块中,防止错误破坏脚本,那么您的解决方案也会起作用。另外,firefox中的一个bug显然会在最初未定义
yourFunctionName
时引发错误。yourFunctionName='undefined'的
类型可以工作。
if ( jsAPI.hasBeenLoaded ){ … }
else { //loads the API via new API() }