Javascript:改变条件内部函数内变量的值
我想重用一个复杂的函数,并且如果我可以改变位于该函数内的条件内部的局部变量的值,它将完美工作。Javascript:改变条件内部函数内变量的值
熬下来:
var func = complicated_function() {
// lots of code
if (something) {
var localvar = 35;
}
// lots of code
}
我需要localVar的是一些其它号码。
有什么办法可以将localvar分配给别的东西,而不需要真正修改函数本身的任何东西吗?
更新:答案是肯定的!请参阅下面的回复。
我大约三个星期前问这个问题,并在半小时之内有五个答案,所有的基本上告诉我这是不可能的。
但我很高兴地宣布答案是YES,它可以做到!
方法如下:
var newfunc = func.toString().replace('35', '42');
eval('newfunc = ' + newfunc);
newfunc();
当然,它使用eval,这可能意味着它是邪恶的,或者至少是非常不可取的,但在这种特殊情况下,它的工作原理。
有什么办法可以将localvar分配给别的东西,而不需要实际修改函数本身的任何东西吗?
没有。
不,但可以有条件地分配它,以便函数签名(基本上,所需的输入和输出)不会更改。添加参数,并将它默认为当前值:
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
}
我猜如果答案是“否”,那么这个答案至少可以指导我如何减少/消除改变功能可能导致的问题的正确方向。 – jawns317
如果函数使用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
如果没有,那么你就不能在不改变功能的改变。
在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族语言。定义函数顶部的所有变量。
您要查找的术语是“悬挂”。 –
正确。谢谢马特。现在我将再次阅读Good Parts。 –
号不改变复杂的功能也没有办法,在JavaScript可以使用呼叫manipilate这和适用。您可以在复杂的功能覆盖功能或增加新的,如果这是一个选项(但它们将不能够访问本地变量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
localvar在“大量代码”中的其他地方使用吗? –