2012-02-21 15 views
1

CoffeeScript將在方法內聲明的變量包裝在對象文字中。如何避免CoffeeScript方法變量被對象字面值包裝?

所以,這樣的:

@Templates = 
    get: (templateName) -> 
     result: ''    # DECLARED HERE 
     $.ajax(
      'Views/Templates/' + templateName + '.html', 
      type: 'GET' 
      dataType: 'html' 
      success: (data) -> 
       result = data # ASSIGNED HERE 
      async: false 
     ) 
     return result   # RETURNED HERE 

變爲這樣:

(function() { 

    this.Templates = { 
    get: function(templateName) { 
     ({ 
     result: ''     //DECLARED IN AN OBJECT LITERAL - I DON'T WANT THIS 
     }); 
     $.ajax('Views/Templates/' + templateName + '.html', { 
     type: 'GET', 
     dataType: 'html', 
     success: function(data) { 
      var result;    //DECLARED LOCAL TO THE CALLBACK - I DON'T WANT THIS 
      return result = data; 
     }, 
     async: false 
     }); 
     return result;    //RETURNED HERE - UNASSIGNED 
    } 
    }; 

}).call(this); 

但我需要什麼,這對我的作品,是這樣的:

(function() { 

    this.Templates = { 
    get: function(templateName) { 
     var result = ''    //DECLARED HERE 
     $.ajax('Views/Templates/' + templateName + '.html', { 
     type: 'GET', 
     dataType: 'html', 
     success: function(data) { 
      return result = data;  //ASSIGNED HERE 
     }, 
     async: false 
     }); 
     return result;    //RETURNED HERE 
    } 
    }; 

}).call(this); 

我在做什麼錯誤?我怎樣才能解決這個問題?

+0

這並不是一個封閉它的對象文本和它包裹着的括號以使得它不會作爲一個塊 – Esailija 2012-02-21 15:26:55

+1

同步GET可以治療嗎?這可能不是一個好主意。 – loganfsmyth 2012-02-21 15:37:23

+0

我忘了提及我是CoffeeScript和Javascript的新手。感謝所有的答案和提示。 – 2012-02-22 18:06:25

回答

4

你所謂的閉包不是閉包(JavaScript中的閉包始終是函數)。這是一個用圓括號包裹的對象。

我真的不太子港既成事實與CoffeeScript的,但如果你想result是在get函數的局部變量,我相信你想改變

result: '' 

result = '' 

前者是對象初始化器格式(因此它被轉換爲對象文本),後者是一個變量賦值。似乎在lexical scoping下的CoffeeScript網站上被覆蓋。

+1

不錯的猜測,應該這樣做。 [證明](http://bit.ly/zurGvq) – GregL 2012-02-21 15:33:21

+0

@GregL:謝謝。 – 2012-02-21 15:34:18

2

爲什麼使用:?它沒有被封裝在一個閉包中,你只是定義一個匿名對象表達式。

只是這樣做:

result = '' 

這就是說,你爲什麼做一個同步GET?這是非常令人不滿的,並且會讓你的網站反應遲鈍。

2

通過result: ''你聲明一個對象的屬性。你需要的是申報由result = ''一個局部變量:

get: (templateName) -> 
    result = ''    # DECLARED HERE 
    $.ajax(
     'Views/Templates/' + templateName + '.html', 
     type: 'GET' 
     dataType: 'html' 
     success: (data) -> 
      result = data # ASSIGNED HERE 
     async: false 
    ) 
    return result   # RETURNED HERE