2013-02-11 22 views
1

是否可以將函數參數的屬性擴展到函數的局部範圍?看看下面的代碼:是否可以將Javascript函數參數的屬性擴展到本地範圍?

function foo(a, b) { 
    // apply some magic here to extend arguments' properties into local scope 
    assert(bar == 'hello') 
    assert(baz == 'world') 
    assert(qux == 1234) 
} 

foo({bar: 'hello', baz: 'world'}, {qux: 1234}) 

假如我沒有對如何foo叫和我有控制只在其實施控制,是有什麼我可以做foo,這將使它無需前綴,說,bara.bar

我意識到在這樣一個人爲的例子中,這可能看起來很瘋狂,所以讓我解釋一下我的總體目標。我想以這樣一種方式使用requirejs,以便我不必在模塊名稱前面輸入模塊的成員。例如:

requirejs(['mod'], function(mod) { 
    assert(mod.blah()) // OK, normal 
    assert(blah())  // needs magic to work 
}) 

我之所以試圖做到這一點的是,我有一個在我看來,在邏輯上在單一模塊中屬於一起的幾個文件,但爲了方便對發展的原因並不在同一個源拌勻文件 - 例如生產代碼和測試代碼。

回答

0

已經有一段時間了,但我發現了一種方法來做到這一點。可以使用JavaScript with關鍵字將對象擴展到本地範圍。然而,根據MDN(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/with),不鼓勵使用with。但是如果一個人真的想擴大本地範圍,這就是它的樣子。

function foo(a, b) { 
    with (a) { 
    with(b) { 
     assert(bar == 'hello') 
     assert(baz == 'world') 
     assert(qux == 1234) 
    } 
    } 
} 

foo({bar: 'hello', baz: 'world'}, {qux: 1234}) 
2

我對試圖做到這一點的原因是,我有一個在我看來,在邏輯上與單個模塊

阿中屬於一起的幾個文件,我們已經有了一個XY-問題:-)由於在js中沒有像這樣的魔術(除了僅僅製作所有模塊屬性全局變量 - 當然不是你想要的),你將需要另一種解決方案。

ab混合成單個模塊很簡單,通過使用extend方法。使用jQuery,它可能看起來像

var c = $.extend({}, a, b); 

但你可以做一個簡單的for-in-loop以及。你甚至可以聲明它爲一個自己的requirejs模塊,依賴於a和b並返回c;所以你只需要請求c。

爲便於發展的原因不相同的源文件中拌勻

有可能是通過使用構建工具的幾個開發文件合併成一個(巨大)生產其他的可能性文件。不確定這是否適用於您的情況。

+0

啊,有趣的 - 我會研究'延長'。至於使用構建工具,我寧願不要。 – 2013-02-11 18:32:43

+0

好的,使用'extend'可以在*'a'和'b'之外很好地運行代碼*,但是我想要的是*'a'內部的代碼*能夠在沒有前綴的情況下使用'b'中的東西,對於stuff *裏面*'b'能夠使用沒有前綴的'a'中的東西。 – 2013-02-11 18:52:29

+0

呃,只有在相同範圍內纔有可能。你真的應該找一個能自動合併這兩個文件的工具。 – Bergi 2013-02-11 18:55:13

相關問題