Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 工厂功能链表问题_Javascript - Fatal编程技术网

Javascript 工厂功能链表问题

Javascript 工厂功能链表问题,javascript,Javascript,我尝试使用工厂函数的方式实现一个对象,并尝试了一个链表示例,在该示例中,我初始化一个空链表,然后尝试添加节点,在add方法中,如果未设置,则设置头,否则将节点添加到链中的最后一个节点问题是头部似乎从未固定,你知道为什么吗? "use strict" const niceLog = s => { console.log(JSON.stringify(s, null, 2)) } function linkedList() { let head const node = d

我尝试使用工厂函数的方式实现一个对象,并尝试了一个链表示例,在该示例中,我初始化一个空链表,然后尝试添加节点,在add方法中,如果未设置,则设置头,否则将节点添加到链中的最后一个节点问题是头部似乎从未固定,你知道为什么吗?

"use strict"

const niceLog = s =>  {
  console.log(JSON.stringify(s, null, 2))
}

function linkedList() {
  let head

  const node = data => {
    return {
      data,
      next: null
    }
  }

  const add = data => {
    if (!head) {
      head = node(data)
    } else {
      const end = node(data)
      let n = head
      while (n.next) n = n.next
      n.next = end
    }
  }

  const del = data => {
    let n = head

    if (n.data === data) head = head.next

    while (n.next) {
      if (n.next.data === data) {
        n.next = n.next.next
        return
      }
      n = n.next
    }
  }


  return {
    head,
    add,
    del
  }
}


const ll = linkedList()

ll.add('cheese')
ll.add('crackers')
ll.add('tea')
ll.add('coffee')

niceLog(ll) // {}
下面是es6类语法中的等效代码,它确实有效(我听说工厂函数更好,因为它们可以避免新的问题,并且这些关键字设置不正确,所以我尝试使用工厂函数)


这篇评论太长了。您似乎对JavaScript中的“工厂函数”感到困惑。factory函数并不意味着您可以避免使用
this
关键字。这确实意味着您要避免使用
new
关键字:

let myFactoryPrototype = {
  someMethod: function() {
    return this.foo;
  }
};

let myFactory = () => Object.create(myFactoryPrototype);
let myObject = myFactory(); // no 'new'
请注意规则和箭头函数语法的混合。我在
这个
不重要的地方使用了箭头函数,在它重要的地方使用了常规的
函数。如果要避免此
,请不要使用方法,请使用对数据类型进行操作的常规(可能是纯)函数:

const addToLinkedList = (list, node) => {
  // code return a new list with the extra node goes here
};

但是,实际上,在JavaScript中避免这一点是很困难的,你真的很难做到。另一方面,避免
新建
非常简单,只需使用
对象。创建
或对象文字。

这对于注释来说太长了。您似乎对JavaScript中的“工厂函数”感到困惑。factory函数并不意味着您可以避免使用
this
关键字。这确实意味着您要避免使用
new
关键字:

let myFactoryPrototype = {
  someMethod: function() {
    return this.foo;
  }
};

let myFactory = () => Object.create(myFactoryPrototype);
let myObject = myFactory(); // no 'new'
请注意规则和箭头函数语法的混合。我在
这个
不重要的地方使用了箭头函数,在它重要的地方使用了常规的
函数。如果要避免此
,请不要使用方法,请使用对数据类型进行操作的常规(可能是纯)函数:

const addToLinkedList = (list, node) => {
  // code return a new list with the extra node goes here
};

但是,实际上,在JavaScript中避免这一点是很困难的,你真的很难做到。另一方面,避免
new
非常简单,只需使用
Object。创建
或Object文本。

那么…你的问题是什么?我现在添加了问题部分!那么…你的问题是什么?我现在添加了问题部分!