2011-08-31 91 views
0

我想重用一个复杂的函数,并且如果我可以改变位于该函数内的条件内部的局部变量的值,它将完美工作。Javascript:改变条件内部函数内变量的值

熬下来:

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

我需要localVar的是一些其它号码。

有什么办法可以将localvar分配给别的东西,而不需要真正修改函数本身的任何东西吗?

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

+0

localvar在“大量代码”中的其他地方使用吗? –

回答

0

我大约三个星期前问这个问题,并在半小时之内有五个答案,所有的基本上告诉我这是不可能的。

但我很高兴地宣布答案是YES,它可以做到!

方法如下:

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

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

1

有什么办法可以将localvar分配给别的东西,而不需要实际修改函数本身的任何东西吗?

没有。

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 
} 
+0

我猜如果答案是“否”,那么这个答案至少可以指导我如何减少/消除改变功能可能导致的问题的正确方向。 – jawns317

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 

如果没有,那么你就不能在不改变功能的改变。

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族语言。定义函数顶部的所有变量。

+1

您要查找的术语是“悬挂”。 –

+0

正确。谢谢马特。现在我将再次阅读Good Parts。 –

1

号不改变复杂的功能也没有办法,在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