2016-01-11 104 views
1
function foo(itemA) { 
    async.waterfall(
    [ 
     function(callback) { 
     console.log("I can see itemA as " + itemA); // <-- this works fine 
     callback(null); 
     }, 
     outerFunction // <-- this method doesn't have access to itemA 
    ], 
    function(err, item) {} 
); 
} 

function outerFunction(callback) { 
    //item A is not defined so this barfs 
    console.log("I'm going to throw an exception cause... " + itemA); 
} 

爲了整潔起見,我既不想在瀑布內定義所有的函數,也不想玩遍各種包含值的對象的各種精細遊戲,以便這些方法可以訪問它們,但我不清楚如何(或如果)可以使用bindapply來給這些外部定義的方法訪問itemA,或者如果有一些我不熟悉的其他機制可以使這成爲可能。有沒有一些方法可以使用.bind或.apply給調用方法或調用方法的範圍?

回答

3

編號在Javascript中的範圍是詞法(根據代碼的位置)。您不能更改已經聲明的函數的範圍。

然而,您可以簡單地通過itemAouterFunction作爲參數,當你調用它。這是解決像這樣的問題的通常和預期的方式。

還有其他技術可以讓更多的東西自動訪問一組變量,比如給一個更高但共享的作用域賦值,或者在共享對象上創建所有可以共享對實例數據的訪問的方法,但它是從這個問題的描述中看不出這些問題在這種情況下是否合適。

但我不是它如何(或是否)有可能使用綁定或申請 給這些外部定義的方法訪問意達明確或存在 一些其他的機制,我不熟悉會使這 成爲可能。

.bind().apply()不以任何方式影響範圍。它們讓您控制this的值和/或函數的參數。如果感興趣的變量在某個對象上可用,則可以使用.bind(),.apply().call()this的值設置爲該對象,並允許您的函數通過this.property訪問數據。

+0

我有這樣的感覺,但希望我能忽略某種方式來做到這一點。正如我的問題所述,我很清楚如何傳遞價值觀並使用它們,就像我多年來一直在做的一樣......這讓我想起了我可能忽視了一個非常強大的機制,但唉,它會出現我沒有。 –

+0

@GeniaS。 - 不通過範圍。 Javascript中的範圍是基於代碼的詞法佈局 - 而不是你可以用'.bind()'或'.apply()'修改的東西。 – jfriend00

+0

「* Javascript中的範圍是詞法... *」除[*帶有*](http://www.ecma-international.org/ecma-262/6.0/#sec-with-statement)外,但沒有人提及任何更多。 ;-) – RobG

相關問題