我目前特別學習JS和ES6。我無法理解爲什麼我的代碼具有類構造函數和箭頭函數,沒有一些更改就無法正常工作。ES6類構造函數和箭頭函數的解釋效果
這裏是我開始的地方,一個ES6模塊導出這個類似flux的調度器對象。
// RiotControl dispatcher formatted as ES6 module.
// https://github.com/jimsparkman/RiotControl
var dispatcher = {
stores: [],
addStore: function(store) {
this.stores.push(store);
}
};
['on','one','off','trigger'].forEach(function(api){
dispatcher[api] = function() {
var args = [].slice.call(arguments);
this.stores.forEach(function(el){
el[api].apply(null, args);
});
};
});
export default dispatcher
我想作一類出這個代碼,並最初以結束:
// RiotControl dispatcher formatted as ES6 class module.
// https://github.com/jimsparkman/RiotControl
export default class {
constructor() {
this.stores = []
this.addStore = store => {
this.stores.push(store);
}
['on','one','off','trigger'].forEach(fn => {
this[fn] =() => {
var args = [].slice.call(arguments)
this.stores.forEach(function(el){
el[fn].apply(null, args)
})
}
})
}
}
不知什麼原因對我來說,這是行不通的。
- 第一個
.forEach(...)
結果爲Uncaught TypeError: Cannot read property 'forEach' of undefined
,就好像該數組沒有定義一樣。 var args = [].slice.call(arguments)
結果args是一個零長度數組,而不是實際上,umm,有參數。
要獲取該代碼的工作,我把它改成這樣:
// RiotControl dispatcher formatted as ES6 class module.
// https://github.com/jimsparkman/RiotControl
export default class {
constructor() {
this.stores = []
this.addStore = store => {
this.stores.push(store);
}
var api = ['on','one','off','trigger']
api.forEach(fn => {
this[fn] = function() {
var args = [].slice.call(arguments)
this.stores.forEach(function(el){
el[fn].apply(null, args)
})
}
})
}
}
因此,錯誤是由
- 固定聲明數組,並呼籲
.forEach
上和 - 使用常規回調函數而不是箭頭函數。
請解釋爲什麼帶內聯數組的forEach
失敗,以及爲什麼從箭頭函數內部切割參數列表失敗。
此外,獎金問題,爲什麼在'this.stores.foreach`綁定到我的對象實例,而不是例如。導致函數被調用的事件?
如果你使用分隔符'';你還會得到錯誤嗎?你似乎對它們過敏 – 2015-03-31 19:13:41
正確,錯誤的分號是錯誤#1的原因。我沒有過敏,但我看過的幾個圖書館似乎忽略了分隔符。我只需要學習規則並採用慣例來使用或不使用它們。不過,使用它們似乎更安全。 – 2015-03-31 20:15:57