如何在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() }