=>和this

好比說有這麼一段代碼:javascript

var O = function(data){
  this.data = data
}
O.prototype.selfCall = function(data){
  if(data.length>1){
    data.forEach(function(e){console.log(this)})
  }else{
    console.log(this);
  }
}
var o = new O("test")
o.selfCall([1])
o.selfCall([1,2])

輸出的結果是:java

O { data: 'test' }
{ DTRACE_NET_SERVER_CONNECTION: [Function],
  DTRACE_NET_STREAM_END: [Function],
  DTRACE_HTTP_SERVER_REQUEST: [Function],
  DTRACE_HTTP_SERVER_RESPONSE: [Function],
  DTRACE_HTTP_CLIENT_REQUEST: [Function],
  DTRACE_HTTP_CLIENT_RESPONSE: [Function],
  ...

第一個輸出的this是確實指向了對象O,可是第二個由於套了一個function,因此這時候的this就指向了函數自己。
若是想用this指向O的話,能夠這麼寫:segmentfault

O.prototype.selfCall = function(data){
  n = this
  if(data.length>1){
    data.forEach(function(e){console.log(n)})
  }else{
    console.log(this);
  }
}

就是在函數外面用n存一下this,以後靠着函數的lexical(是這麼說的麼?)關係,拿外層的n來引用O。不過前段時間看過別人講=>能夠傳遞this。當時不知道這有什麼意義,如今看來確實是很好的一個特性。因此上面的程序能夠改爲這樣:函數

O.prototype.selfCall = function(data){
  if(data.length>1){
    data.forEach(e=>{console.log(this)})
  }else{
    console.log(this);
  }
}

總結:this

  • function(){}裏面的this指代的是function自己prototype

  • 能夠經過lexical scope藉助一個變量把外面的this傳進function(){}code

  • =>不單單讓匿名函數的書寫更簡單,還有一個很是好的特性:this的傳遞對象

  • =>同時還會避免arguments指向匿名函數:參見回調+遍歷ip

相關文章
相關標籤/搜索