2016-03-06 58 views
0

我有一個我不太明白的函數。正是在這裏:返回函數期間創建的Javascript變量

function responseWithResult(res, statusCode) { 
     statusCode = statusCode || 200; 
     return function(entity) { 
      if (entity) { 
      res.status(statusCode).json(entity); 
      } 
      }; 
     } 

這個函數會得到資源和變量的StatusCode但隨後在返回它似乎創建這個實體變量。實體變量不是在這個函數之外的任何地方創建的,所以它是如何創建的?對於全範圍的是使用該項目是在這裏:

https://github.com/angular-fullstack/generator-angular-fullstack

+1

這是一個參數。 – SLaks

+1

'responseWithResult()'返回一個函數(一個確切的閉包),函數有參數。 'entity'是返回函數的參數。 – Thomas

回答

1

responseWithResult()返回,當你調用它的功能。

當稍後調用返回的函數時,該調用者應該傳遞參數entity。由於關閉,該內部功能將有權訪問res,statusCodeentity。當調用responseWithResult()時,前兩個作爲參數傳遞。當返回的函數被調用時,最後一個被作爲參數傳遞。

所以,這將被用於這樣的:

var fn = responseWithResult(res, someStatus); 

// then some time later 
fn(someEntityValue); 
+0

它非常有意義。我覺得,因爲我花了很多時間來看這個功能,我忘了看到大局。現在,我只是想確保我明白這一點。返回函數傳遞原始調用者的信息,因爲它嵌套在responseWithResult函數內部,所以它也可以訪問res和狀態碼。在這種情況下,res和entity似乎是同一個變量。這是否準確? – Luidelaparra

+0

@Luidelaparra - 'res'和'entity'是不同的參數。兩者都在內部函數中可用。在Javascript中,內部函數自動訪問任何父級作用域中的任何變量。它們不被「傳遞」到內部函數中,而是在函數中簡單訪問,它們是「範圍內的」 – jfriend00

+0

謝謝,我猜想通過是錯誤的詞語,我的意思是使用可訪問的。函數可以訪問這些參數,我非常感謝你回答我的問題,我不想佔用更多的時間,但也許你可以澄清實體的用法,如果我調用responseWithResult(res),responseWithResult設置statusCode,然後調用返回函數傳入的實體中,我認爲會是res。這是不正確的嗎?再次感謝您的時間。 – Luidelaparra

0

調用responseWithResult返回它接受實體作爲一個參數的函數。實體不在函數之外創建,它是分配給返回函數被調用的參數的變量名稱。

這樣做的原因是因爲返回的函數可以通過閉包訪問statusCode和res。

你會調用該函數是這樣的:

responseWithResult('foo', 'bar')('baz'); 

或者這樣:

var fn = responseWithResult('foo', 'bar'); 
fn('baz');