2011-08-31 93 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