0

我正在尝试重用一个复杂的函数,如果我可以更改该函数内部条件中的局部变量的值,它将完美地工作。

归结为:

var func = complicated_function() {
    // lots of code
    if (something) {
        var localvar = 35;
    }
    // lots of code
}

我需要 localvar 是其他数字。

有没有办法将 localvar 分配给其他东西,而无需实际修改函数本身的任何内容?

更新:答案是肯定的!请参阅下面的回复。

4

6 回答 6

1

有没有办法将 localvar 分配给其他东西,而无需实际修改函数本身的任何内容?

没有。

于 2011-08-31T13:35:08.317 回答
1

不,但可以有条件地分配它,以便函数签名(基本上,所需的输入和输出)不会改变。添加一个参数并将其默认为当前值:

var func = complicated_function(myLocalVar) {
    // lots of code
    if (something) {
        // if myLocalVar has not been set, use 35.
        // if it has been set, use that value
        var localvar = (myLocalVar === undefined)?35:myLocalVar;
    }
    // lots of code
}
于 2011-08-31T13:36:26.990 回答
1

不。

不改变复杂的函数是没有办法的,在javascript中你可以通过调用和应用来操作它。如果这是一个选项,您可以覆盖复杂函数中的函数或添加新函数(但它们将无法访问局部变量 localvar)。

这更多是为了好玩,我真正的答案仍然是否定的。

如果你感到疯狂:)

var complicatedFunction = function() {
  var i = 10;

  var internalStuff = function() {
    console.log(i); // 10 or 12?
  };

  return internalStuff();

};

var complicatedFunction;

eval("complicatedFunction = " + complicatedFunction.toString().replace(/i = 10/, 'i = 12'));

complicatedFunction(); //# => 12
于 2011-08-31T13:52:30.113 回答
0

如果函数使用this.localvar

var func = function() {
    alert(this.localvar)
    if (true) {
        var localvar = 35;
    }
    // lots of code
    alert(this.localvar)
}
var obj = {localvar: 10}; 
func.call(obj); // alerts 10 twice

如果没有,那么你不能在不改变功能的情况下改变它。

于 2011-08-31T13:36:58.913 回答
0

在 javascript 中,变量被“推”到其函数的顶部。javascript 中的变量具有函数作用域,而不是像 C、C++、Java 和 C# 那样的“花括号”作用域。

这与您(开发人员)手动将其推到顶部的代码相同:

var func = complicated_function() {
   var localvar = 0;
   // lots of code
   if (something) {
       localvar = 35;
   }
   // lots of code
}

将变量“向上”声明为一个函数对您有帮助吗?至少声明是孤立的。

function whatever() {
  var localvar = 0;

  var func = function() {
    var something = true;

    // lots of code
    if (something) {
        localvar = 35;
    }
    // lots of code
  };

 func();
 alert(localvar);
}
whatever();

这是 jsFiddle:http: //jsfiddle.net/Gjjqx/

见克罗克福德:

http://javascript.crockford.com/code.html

JavaScript 没有块作用域,因此在块中定义变量会使熟悉其他 C 家族语言的程序员感到困惑。在函数顶部定义所有变量。

于 2011-08-31T13:43:05.357 回答
0

大约三周前我问了这个问题,在半小时内得到了五个答案,基本上都告诉我这是不可能的。

但我很高兴地宣布,答案是肯定的,可以做到!

就是这样:

var newfunc = func.toString().replace('35', '42');
eval('newfunc = ' + newfunc);
newfunc();

当然,它使用 eval,这可能意味着它是邪恶的,或者至少是非常不可取的,但在这种特殊情况下,它是有效的。

于 2011-09-19T13:33:07.617 回答