=>和this

比如说有这么一段代码:

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])

输出的结果是:

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的话,能够这么写:

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);
  }
}

总结:

  • function(){}内里的this指代的是function自身

  • 能够经由过程lexical scope借助一个变量把表面的this传进function(){}

  • =>不单单议让匿名函数的誊写更简朴,另有一个非常好的特征:this的通报

  • =>同时还会防止arguments指向匿名函数:拜见回调+遍历

    原文作者:beneon
    原文地址: https://segmentfault.com/a/1190000009740882
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞