Javascript:在条件内部函数内更改变量的值

时间:2011-08-31 13:32:48

标签: javascript function local-variables

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

把它煮沸:

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

我需要localvar作为其他数字。

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

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

6 个答案:

答案 0 :(得分:1)

  

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

不。

答案 1 :(得分: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
}

答案 2 :(得分:1)

没有

在不改变复杂功能的情况下,没有办法,在javascript中你可以通过使用call和apply来操纵它。您可以覆盖复杂函数中的函数,或者如果这是一个选项则添加new(但它们将无法访问局部变量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

答案 3 :(得分: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

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

答案 4 :(得分:0)

在javascript中,变量被“推送”到其函数的顶部。 javascript中的变量具有功能范围,而不是像C,C ++,Java和C#那样的“大括号”范围。

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

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

声明变量“up”一个函数会帮助你吗?至少声明是孤立的。

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/

见Crockford:

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

  

JavaScript没有块范围,因此在块中定义变量会使经验丰富的程序员与其他C族语言混淆。定义函数顶部的所有变量。

答案 5 :(得分:0)

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

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

以下是:

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

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