coffeescript的上下文

CoffeeScript代碼中,變量,甚至函數前面有時會帶上一個@符號,那麼翻譯到 javascript裏,就是 「this.」javascript

這就涉及到運行過程當中的上下文。java

這個this指什麼,網上有專門的文章介紹。按我目前的理解,並不徹底等同於面嚮對象語言裏的this,是要區分狀況:ruby

一、若是它位於普通函數內部,那麼這個this是指這個函數,或代表它的做用域,僅限於這個函數內部函數

二、若是所在函數屬於 prototype,那麼這個this就與運行中的上下文有關。this

如下代碼,能夠仔細參詳、比較一下:spa

CoffeeScript:prototype

class User
  name:'unknown'

  constructor : (name) ->
    @name = name
  
  sayHello : ->
    "您好!\r\n普通函數:#{_getName()}!\r\nprototype函數:#{@getName()}!"

  _getName = ->
    @name + '先生'

  getName : ->
    @name + '先生'

user = new User('leftfist')
alert user.sayHello()


對應javascript:

var User, user;

User = (function() {
  var _getName;

  User.prototype.name = 'unknown';

  function User(name) {
    this.name = name;
  }

  User.prototype.sayHello = function() {
    return "您好!\r\n普通函數:" + (_getName()) + "!\r\nprototype函數:" + (this.getName()) + "!";
  };

  _getName = function() {
    return this.name + '先生';
  };

  User.prototype.getName = function() {
    return this.name + '先生';
  };

  return User;

})();

user = new User('leftfist');

alert(user.sayHello());

運行結果就是翻譯

您好!code

普通函數:先生!對象

prototype函數:leftfist 先生!

能夠看到,在普通函數裏,雖然使用了 this.name,但此this指的是_getName本身,非彼user = new User('leftfist')那個user,故而拿不到name,空空焉。
相關文章
相關標籤/搜索