2015-10-23 49 views
0

我是JS的新手,所以請耐心等待。javascript中函數定義的歧義

是什麼

function get (attr) { 
    return function (object) { return object[attr]; } 
} 

function get (attr) { 
    return object[attr]; 
} 

爲什麼第一功能工作,但第二次沒有區別?找不到合理的解釋。 工作示例代碼:https://jsfiddle.net/xf2u0ncL/

+0

第一個返回的功能和第二個返回一個對象 – azad

+1

我這裏 – Alex

+0

看到沒有歧義@Azzi第二返回任何東西,字符串,功能,數量,對象。取決於它返回的是什麼財產。 – ste2425

回答

0

在您的第二個代碼中,object來自哪裏?!這是整個問題。

第一代碼用於這樣的:

// same as getter = function (object) { return object['foo']; } 
var getter = get('foo'); 
var value = getter({ foo: 'bar' }); 

get接受一個屬性名稱,並返回它接受一個對象,並返回值的函數。你的第二個函數在任何時候都不接受任何對象,那麼它應該返回什麼?

+0

同意該對象沒有在第二個func中聲明。但是,當對象被傳遞時,瀏覽器是如何知道第一個函數中的對象不是屬性本身的?它是如何區分的?首先,屬性在get中傳遞,然後在內部函數對象中傳遞。 – chakra

+0

由於範圍界定。在第一個函數中傳遞的屬性與返回函數的範圍相同,這表示返回的函數可以訪問它。儘管這是一種非常糟糕的解釋方式,但這可能有助於http://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/基本上,第一個函數設置第二個函數可以訪問的另一個變量。第二個函數設置了一個不同的變量。那怎麼知道哪個是哪個。 – ste2425

+0

@chakra因爲這就是函數所說的。傳遞給'get'的'attr'稍後在'object [attr]'中使用,這很清楚。 'object'是'get'返回的函數的參數。您需要了解*高階函數*(返回函數的函數)和*閉包*(在'object [attr]'後面'attr'稍後可用的機制]。谷歌爲這些關鍵詞和學習,無需在評論中從頭開始澄清這些事情。 – deceze

0

看起來像你有一個方法,你試圖返回一個對象的屬性。

上述兩種方法都可以工作,但期望在不同範圍內的變量將以不同的方式執行。

第一種方法返回第二種方法,您將其傳遞給對象以獲取屬性。所以

get('foo')({foo: 'bar'}); //returns 'bar' 

而第二個作品是這樣

var object = { 
    foo: 'bar' 
} 

get('foo'); //returns 'bar'; 

第二節選object是一個全局變量,或因爲它沒有在功能它自定義一個更高的範圍至少。

第一種方法是傳遞一個對象來搜索屬性。第一,雖然有點複雜,但比預期和依賴全球變量的第二個更好,更容易測試。

看到小提琴:http://jsfiddle.net/b327nr74/