我正在尝试重用一个复杂的函数,如果我可以更改该函数内部条件内的局部变量的值,它将完美地工作。
把它煮沸:
var func = complicated_function() {
// lots of code
if (something) {
var localvar = 35;
}
// lots of code
}
我需要localvar作为其他数字。
有没有办法将localvar分配给其他东西,而不实际修改函数本身的任何内容?
更新:答案是肯定的!请参阅下面的回复。
答案 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,这可能意味着它是邪恶的,或者至少是非常不可取的,但在这种特殊情况下,它可以工作。