簡體   English   中英

Javascript 局部變量技術

[英]Javascript local variable technique

我有一個與單行編程相關的簡單問題。 先舉個例子:

function test(a)
{
   var b=a.toString();
   return b.replace("a","b");
}

這很簡單(這個函數當然沒用),但這里的問題稍微復雜一點:如果我要在一行中完成這個怎么辦? 我有我的想法,但告訴我這在內存清理方面是否正常工作:

function test(a)
{
   return (arguments[1]=a.toString()).doSomething().doSomethingMore(arguments[1]);
}

這當然是一個例子,但想法很簡單:使用參數作為局部變量的容器 - 我不確定,但據我所知,當一個函數結束時,參數也會被刪除? 或者在參數中創建新元素是否使這個元素全局定義? 從我的測試來看,我似乎是正確的,但我很想知道是否有人嘗試過這個? 這是一個安全和干凈的解決方案嗎?:) 感謝您的任何評論。

以下是單行腳本問題的一個更實際的問題:

function (number,limiter)
{
return ((arguments[2] = number.toString().replace(
         new RegExp("(\\d+)(\\d{3})($|"+limiter+")"),
         '$1'+limiter+'$2$3')) == number) ?
            arguments[2] : 
            arguments.callee(arguments[2],limiter);
}

這個單行函數對給定的字符串執行操作並返回它或將其遞歸解析為同一個函數。 (在其他線程上,我展示了如何在沒有遞歸的情況下完成此操作,但這不是問題的情況)。

你不必要地使操作復雜化。 你根本不需要聲明任何東西。

function test(a) {
return a.toString().replace("a","b");
}

這不應該對性能或內存造成影響。

但是,如果您要使用閉包,則可能會遇到內存問題。

像您所做的那樣為參數數組賦值是毫無意義的,因為每個函數都有自己的參數數組。 為了解決您關於范圍的問題,Javascript 范圍是詞法的; 在函數內部聲明的東西不能自動被函數外部的東西訪問。

編輯:使用參數數組並不比任何其他方法更干凈或更好。 這實際上比清楚更糟糕。

您的示例可能使一個簡單的操作過於復雜,但您正在演示的技術稱為方法“鏈接”。 這是一種完全有效的形式,當不需要或不需要中間結果時,它實際上可以用來使代碼更具可讀性。

我目前最喜歡的例子是美妙的DateJs

var nextTuesday = DateJs.today().next().tuesday();

var aBitLater = DateJs.now().addHours(1).addMinutes(30);

當然,它是語法糖,可以作為單獨的語句更詳細地編寫,但是通過仔細的方法命名,您實際上可以使它讀起來像英語。

GC / 內存管理不受這種風格的影響,函數的參數就像其他任何東西一樣被清理。 事實上,它實際上可能更安全,因為在函數調用返回后參數立即超出范圍,並且不需要為值創建本地變量,只是為了將它們傳遞給下一個函數調用。

你的例子可能有點做作,但如果你在有意義的地方使用它,這是一個有用的模式。

“首先,調試的難度是編寫代碼的兩倍。因此,如果您盡可能聰明地編寫代碼,那么根據定義,您就不夠聰明,無法調試它。” – 布賴恩 W. Kernighan

我不是在敲你,我只是說小心不要過分熱心。

我認為你只需要嘗試閱讀它就會意識到它不是一個“干凈”的解決方案! 我特別要避免鏈接這樣的任務:

return (arguments[1]=a.toString()).doSomething().doSomethingMore(arguments[1]);
// is this a or a.toString()? it's not clear at a glance -------------^

為什么要避免在本地創建變量? 這樣做會使代碼更容易閱讀/理解,而且我認為您並沒有真正獲得任何東西。

變量基本上只是對您正在創建的對象的引用。 無論您將它們分配給普通變量還是將它們放入數組中,清理都將是相同的。 一旦方法返回,參數數組和局部變量都將超出范圍,因此我認為您不會看到任何行為差異。 (如果該方法是通過 apply() 命令調用的,則參數數組的范圍可能會有所不同,但我尚未對此進行測試以確保)。

~~瑟瑟發抖~~

這讓我想起了awk ,除非您在參數列表中聲明額外的變量,否則無法在函數中使用局部變量。

如果你需要一個局部變量,那就去做吧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM