2016-11-30 3 views
-2

Что это значит в Coffeescript, когда имя переменной начинается с знака «@»? Например, я просматривал исходный код hubot и только в первые несколько строк, я смотрел, я нашелПеременные «@» Coffeescript

class Brain extends EventEmitter 
    # Represents somewhat persistent storage for the robot. Extend this. 
    # 
    # Returns a new Brain with no external storage. 
    constructor: (robot) -> 
    @data = 
     users: { } 
     _private: { } 

    @autoSave = true 

    robot.on "running", => 
     @resetSaveInterval 5 

Я видел его несколько других мест, но я не имею смог угадать, что это значит.

+1

В coffeescript @ это означает. – HelloSpeakman

+1

Вы просмотрели документацию [CoffeeScript] (http://coffeescript.org)? Поиск того, что для '@' ответил бы на ваш вопрос и, вероятно, научил вас еще нескольким вещам. –

ответ

2

Символ @ является shorcut для this, как вы можете видеть в Operators and Aliases.

В качестве ярлыка для this.property, вы можете использовать @property.

0

В основном это означает, что переменными «@» являются переменные экземпляра класса, то есть члены класса. Который не следует путать с переменными класса, которые вы можете сравнить со статическими членами.

Кроме того, вы можете думать о @variables как и this или self операторов ООП языков, но это не точно то же самое, как и старом яваскрипт this. Этот javascript this относится к текущей области, что вызывает некоторые проблемы, когда вы пытаетесь ссылаться на область класса внутри обратного вызова, например, поэтому coffescript ввел @variables, чтобы решить эту проблему.

Например, рассмотрим следующий код:

Brain.prototype = new EventEmitter(); 

function Brain(robot){ 

    // Represents somewhat persistent storage for the robot. Extend this. 
    // 
    // Returns a new Brain with no external storage. 

    this.data = { 
     users: { }, 
     _private: { } 
    }; 

    this.autoSave = true;  

    var self = this; 

    robot.on('running', fucntion myCallback() { 
     // here is the problem, if you try to call `this` here 
     // it will refer to the `myCallback` instead of the parent 
     // this.resetSaveInterval(5); 
     // therefore you have to use the cached `self` way 
     // which coffeescript solved using @variables 
     self.resetSaveInterval(5); 
    }); 
} 

Окончательная мысль, что @ в эти дни означает, что вы имеете в виду экземпляра класса (то есть, this или self). Таким образом, @data в основном означает this.data, поэтому без @ он будет ссылаться на любую видимую переменную data по объему.

 Смежные вопросы

  • Нет связанных вопросов^_^