在ES6中使用lexical

时间:2017-07-04 02:12:15

标签: javascript ecmascript-6

我在ES6中学习词汇this,我反驳了这个例子:

let person = {
    name : 'Alex',
  cars : ['Ferrari','Jaguar','Bugatti','Cadillac'],
  toString : function(){
    for(let car of cars){
            console.log(`${this.name} has ${car}`)
        }
  }
}

person.toString();

所以让我说我想将toString函数转换为数组函数,所以我会这样:

let person = {
    name : 'Alex',
  cars : ['Ferrari','Jaguar','Bugatti','Cadillac'],
  toString : () => {
    for(let car of cars){
            console.log(`${this.name} has ${car}`)
        }
  }
}

person.toString();

在此示例中cars未定义,我为什么会这样做,以及如何在该示例中从cars对象中调用person

同样如此:

let person = {
    name : 'Alex',
  cars : ['Ferrari','Jaguar','Bugatti','Cadillac'],
  toString : () => {
    cars.forEach(car => console.log(`${this.name} has ${car}`));
  }
}

person.toString();

2 个答案:

答案 0 :(得分:3)

第一个例子已经破了。

  

在此示例中cars未定义,为什么我得到

没有名称为cars的变量。你是否使用箭头功能并没有什么不同。

  

如何在该示例中从cars对象中调用person

使用方法或函数表达式并使用this.cars引用它:

let person = {
  name : 'Alex',
  cars : ['Ferrari','Jaguar','Bugatti','Cadillac'],
  toString() {
    for(let car of this.cars){
            console.log(`${this.name} has ${car}`)
        }
  }
}

箭头函数不能用作实例方法,因为在实例方法中,您不需要词法this。了解详情:Arrow function vs function declaration / expressions: Are they equivalent / exchangeable?

答案 1 :(得分:0)

由于您的箭头功能,this适用于您所调用的函数的对象。

<强>正确

let person = {
  name : 'Alex',
  cars : ['Ferrari','Jaguar','Bugatti','Cadillac'],
  toString : function() {
   this.cars.forEach(car=>{
        console.log(`${this.name} has ${car}`)
    })
  }
}

person.toString();

foreach中的最后一个箭头功能适用于您的对象,为什么您不需要像this.cars.forEach(...)(this.name)这样使用clourse。