2017-08-03 186 views
1

任何人都可以解釋這個函數的作用。 我不明白函數定義解析(組)正在通過的部分'data'Javascript函數返回函數定義

function getData(data) { 
     data = (data === undefined) ? this.defaultData() : data; 

     var self = this; 

     return (function parse(group) { 
      return self.change('groupTo', groupExp, group); 
     }(data)); 
    } 

現在,我知道這是一個IIFE,我想知道現在是'arg'是否可供使用內doSomething()

(function (local_arg) { 
    doSomething(local_arg); 
})(arg); 
+1

如果不是dup,但是[很好的閱讀](https:// stackoverflow。COM /問題/ 8228281 /什麼 - 是 - 的 - 功能 - 結構 - 在JavaScript的)。 – Teemu

+0

我想你簡化了代碼,因爲如這裏所表示的那樣,它對於可能非常簡單的事情來說過於複雜。你可能會發布(更多)原始代碼? – trincot

+0

閱讀在[MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions#Function_scope)的答案爲已編輯的問題。 – Teemu

回答

1

在這種模式:

(function (local_arg) { 
    doSomething(local_arg); 
})(arg); 

...立即執行的功能,並且參數local_arg將已傳遞的說法,即arg的值。所以上面是做一樣的只是:

doSomething(arg); 

在某些情況下arg是一個比較複雜的表情,而你需要多次使用它,或者你對於只需要知道變量需要在本地,IIFE模式可能有用。

+0

謝謝@trincot.Got我的回答:) – Abhijit

3

這不是一個很好的一段代碼。我不知道從哪裏開始的不好的做法...

此函數定義一個函數,它不能從任何其他範圍內訪問,並且不能重複使用,只是爲了返回其與數據參數的調用。如果調用getData()功能,無需在函數傳遞任何參數,則值的數據變量是不確定的外部迴流可能是簡單

return self.change('groupTo', groupExp, data); 
+0

這是我想了解的一段代碼。 – Abhijit

+0

@Abhijit是的。在'group'在'函數解析(組){}'引用'data' – Thomas

1

。 所以在這條線上使用三元運算符。

data = (data === undefined) ? this.defaultData() : data; 

所以它會檢查是否data === undefined條件這是真的。因此它將分配的this.defaultData()值到數據屬性 總之時的data值是undefined該時間以下是這種情況

data = this.defaultData() 

Otheriwse如果數據具有的值意味着調用函數getData("Hi")與參數那麼它將被評估作爲

data = data // data = Hi 

現在這裏var self = this;是用來保存的this這將在下文中提到嵌套函數內的上下文。

return (function parse(group) { 
     return self.change('groupTo', groupExp, group); 
    }(data)); 

沒有自我=這一點,如果我嘗試在嵌套函數中使用this然後它會指向全局對象即在JS window對象。

以下代碼arg在函數內部是可用的,因爲我們在IIFE的調用中傳遞它,所以傳遞doSomething函數的調用時可用。

(function (local_arg) { 
    doSomething(local_arg); 
})(arg); 
+0

傳遞的值要了解如何'this'的行爲在JavaScript中閱讀這篇文章 http://javascriptissexy.com/understand-javascripts-this -with清晰度和主-IT/ –

+0

採取OP的代碼,因爲它是'this'將把'window'反正。 – Teemu

+0

是啊目前功能是在外面,所以它會指向窗口。但是,如果此功能使用JavaScript編寫的對象,則前後文改變@Teemu –