2016-11-16 42 views
1

我不知道下面的區別的:的Javascript對象範圍界定

export default Ember.Component.extend({ 

    errors: {}, 

    performPermalinkUpdate: function(){ 

     let errors = this.get('errors'); 

     this.requestPermalink(this.get('title'), this.endpoint).then((resp) => {  
      // Do success stuff 
     }).catch((resp) => { 
      Ember.set(errors, 'permalink', "Test"); 
     }); 
    } 
}); 

VS

export default Ember.Component.extend({ 

    errors: {}, 

    performPermalinkUpdate: function(){ 

     this.requestPermalink(this.get('title'), this.endpoint).then((resp) => {  
      // Do success stuff 
     }).catch((resp) => { 
      let errors = this.get('errors'); 
      Ember.set(errors, 'permalink', "Test"); 
     }); 
    } 
}); 

第一個實際上並沒有改變errors財產。該錯誤從未出現在模板上。而第二個和結果的錯誤顯示在我的模板上。

我想我錯過了一個關鍵的範圍問題與承諾。

+1

何時何地錯誤屬性設置?它可能是在'requestPermalink'裏面設置的嗎? – 2016-11-16 17:23:27

+0

如果您說'var',則更新w/more包含第一個函數 – Gurnzbot

+0

的組件,而不是'let'?這裏有什麼意義嗎? – kumkanillam

回答

1

唯一的區別是時機。第一個在訪問errors對象之前,在致電requestPermalink之前。最後一個訪問它後。由於箭頭功能,this上下文相同。


我假設你requestPermalink功能確實是這樣的:

requestPermalink() { 
    // 
    this.set('errors', { debug: "second error object" }); 
}, 

然後你執行的第一個例子中的順序是:

  1. this.errors{},因爲這就是你如何初始化它與errors: {},
  2. 您執行let errors = this.get('errors');。所以現在errors變量與this.errors是同一個對象。
  3. 您致電this.requestPermalink。這將執行我上面發佈的this.set('errors', { debug: "second error object" });。現在this.errors是定義了debug: "second error object"的新對象,而errors變量仍然指向原始對象{}
  4. 接下來執行Ember.set(errors, 'permalink', "Test");。這會將errors變量從{}更改爲{permalink: "Test"}。但this.errors仍然是{ debug: "second error object" }

執行然而,對於第二個例子中的順序:

  1. this.errors{}因爲多數民衆贊成你如何與errors: {},初始化它。
  2. 您致電this.requestPermalink。這將執行我上面發佈的this.set('errors', { debug: "second error object" });。 現在this.errors是定義了debug: "second error object"的新對象。但是目前還沒有errors變量,所以原始對象{}可能會被垃圾收集。
  3. 您執行let errors = this.get('errors');。現在errorsthis.errors相同,看起來像{ debug: "second error object" }
  4. 您修改errorsEmber.set(errors, 'permalink', "Test");。由於errorsthis.errors都是對同一個對象的引用,因此將修改this.errors
+2

這就解釋了OP報告的行爲如何? – 2016-11-16 18:48:57

+0

由於'this'上下文在'let errors = this.get('errors')'這兩個區域是相同的,所以我會假定無論錯誤對象何時被訪問,錯誤對象都會被更新。如果我認爲這是正確的,爲什麼第一個例子中的錯誤對象沒有更新? – Gurnzbot

+0

爲什麼要更新?如果你做'foo = this.bar; this.bar =「blu」;'那麼你不會指望'foo'的值是''blu''吧? – Lux