如何有条件地从函数表达式中包含或排除语句



我有两个不同的javascript环境,并希望创建一个可用的库。要做到这一点,我想使用高阶函数来生成函数,像这样

try {
Maptool.chat.broadcast("")
var myFunc1 = genFunction1("env1");
}
catch(e){
if(e instanceof ReferenceError){
var myFunc1 = genFunction1("env2")
}
}

genFunction1将返回一个函数,我可以调用从函数表达式构建的函数。我知道只有两种方法来生成返回的函数,它可以与内部函数外部的if类似地编写下一个代码块,这会创建大量的代码重复,因为我需要在函数中编写再次保持不变的所有内容。

function genFunction1(env){
if(env == "env1"){
return function () {return 3;}
}
else{
return function () {return 2;}
}  
}

或者像下面的代码块

genFunction1(env){
return function (){
if(env=="env1"){
return 3;
}
return 2;
}
}

然而,如果我们使用一个带有get属性的对象,该对象在访问时记录日志,我们可以看到第三个代码块在每次调用myFunc1时都调用if。

function genFunc1(obj){
return function (){
if(obj.env == "env2"){
console.log("3");
}
console.log("2");
}
}
const obj = {
get env() {
console.log("accessed property");
return "env2";
}
}
var myFunc1 = genFunc1(obj);
myFunc1();
myFunc1();

如前所述,前面的代码块为myFunc1()的每次调用调用get方法一次,但是环境不会改变,除了我第一次检查之外,有没有办法使生成的函数不包含if,并且只在高阶函数中包含if而不重复代码?

当您从对象获取属性时,这是预期的行为。在生成函数之前对值进行快照,如下所示。

function genFunc1(obj) {
var env = obj.env
return function() {
if (env == "env2") {
console.log("3");
}
console.log("2");
}
}