Javascript 为什么我会得到一个;“未定义”;使用";从Find()返回值;这";论点

Javascript 为什么我会得到一个;“未定义”;使用";从Find()返回值;这";论点,javascript,Javascript,我正在学习Ethan Brown的“学习JavaScript”,有一个例子并没有达到应有的效果,我不确定到底出了什么问题。我正在处理的部分是使用find()方法搜索数组,而没有达到预期效果的部分涉及使用find()方法和“this”参数 我希望这个调用find(),它返回“daniel”Person: 要返回与调用find()相同的结果,该调用还应返回“daniel”Person: 相反,第一个find调用工作正常,但第二个返回“undefined”。为什么会这样 下面是完整的代码示例(摘自学习

我正在学习Ethan Brown的“学习JavaScript”,有一个例子并没有达到应有的效果,我不确定到底出了什么问题。我正在处理的部分是使用find()方法搜索数组,而没有达到预期效果的部分涉及使用find()方法和“this”参数

我希望这个调用find(),它返回“daniel”Person:

要返回与调用find()相同的结果,该调用还应返回“daniel”Person:

相反,第一个find调用工作正常,但第二个返回“undefined”。为什么会这样

下面是完整的代码示例(摘自学习JavaScript的第8章-Ethan Brown):

*注意本书使用ES6

class Person {
  constructor(name) {
    this.name = name;
    this.id = Person.nextId++;
  }
}

Person.nextId = 0;

const james = new Person("Jammes"),
      juliett = new Person("Juliett"),
      daniel = new Person("Daniel"),
      jay = new Person("Jay");

const arr = [james, juliett, daniel, jay];

// option 1: find daniel id by direct comparison 
// successfully returns daniel object
arr.find(p => p.id === daniel.id);

// option 2: find jay id by using "this" arg - 
// should return daniel object, instead returns undefined...
arr.find(p => p.id === this.id, daniel);
从中继承它们的词汇绑定

否则,您不能使用或更改箭头函数的绑定,这正是您传入手动绑定时尝试执行的操作

尝试使用常规函数来记录差异

arr.find(function (p) { return p.id === this.id; }, daniel);

@4castle我只是在学习自己,但这是一个很好的解释。为了引用一些证据,这里是@4castle谢谢。只是在答案中添加了一堆链接,包括那个链接。啊,好吧,我很困惑,因为我使用了arrow函数作为另一个函数的参数,我不确定作用域是如何工作的。现在我很困惑!!!谢谢你的“这个”@Oka既然你知道这是怎么回事,也许可以在下一版本的书中向布朗先生提交一份勘误表?他在实际例子中使用的名字是杰米、朱丽叶、彼得和杰伊,我无缘无故地改变了他们。。。
class Person {
  constructor(name) {
    this.name = name;
    this.id = Person.nextId++;
  }
}

Person.nextId = 0;

const james = new Person("Jammes"),
      juliett = new Person("Juliett"),
      daniel = new Person("Daniel"),
      jay = new Person("Jay");

const arr = [james, juliett, daniel, jay];

// option 1: find daniel id by direct comparison 
// successfully returns daniel object
arr.find(p => p.id === daniel.id);

// option 2: find jay id by using "this" arg - 
// should return daniel object, instead returns undefined...
arr.find(p => p.id === this.id, daniel);
arr.find(function (p) { return p.id === this.id; }, daniel);