函数声明中的回调实现有什么意义?



在雄辩的javascript书中,在第6章中有以下示例:

class Matrix {
  constructor(width, height, element = (x, y) => undefined) {
    this.width = width;
    this.height = height;
    this.content = [];
    for (let y = 0; y < height; y++) {
      for (let x = 0; x < width; x++) {
        this.content[y * width + x] = element(x, y);
      }
    }
  }
 //...
}

您可以看到构造函数的第三参数不仅是回调参数,而且实际上是回调的实现。

起初我认为,也许已实现的回调函数的主体被忽略了,但至少将检查构造函数中使用的未来回调以具有相同的签名。但是,我发现签名无关紧要,因为以下代码将起作用:

const test = new Matrix(2, 4, () => console.log('hello'));

那么,实现回调的意义是什么,它是函数的参数?只是让读者推断将传递多少个参数?

如果未指定第三个参数, element的默认值将是 (x, y) => undefined

请参阅此MDN链接。它将提供一些见识。希望这会有所帮助。

示例用element做的是设置默认值。在这种情况下,默认值无济于事。

请注意,您还可以将()=>{}用作元素的默认值,它将在JavaScript中起作用,因为该语言在调用函数时不会验证参数的数量(但它可能会给您带来打字条中的类型检查错误(。

这是一个常见的模式:您不使用undefinednull,而是放置了一个无用的默认参数,因此在代码中,您无需在调用该函数之前检查element是否定义。请参阅:https://en.wikipedia.org/wiki/null_object_pattern

诸如lodash之类的一些库还包括定义为EN空函数的noop等常数,因此您可以将代码写为:

const noop = ()=>{}
class Matrix {
  constructor(width, height, element = noop) {
//...  
  }
}

其他信息:

Matrix构造函数似乎正在初始化单个维度Array来存储矩阵。您可以用Array.from替换该嵌套的for环路。类似:

this.contents = Array.from(
  {length: height * width},
  n => element(n % width, Math.floor(n/height))
);

我没有检查数学,因此示例可能有索引错误。请参阅:https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/array/aray/from

我理解的方式,它只是可选的初始化器。如果您使用诸如() = > 0之类的东西调用它,它将用0而不是undefined初始化矩阵。(x,y) => x === y ? 1 : 0将产生一个身份矩阵。等....

(阅读本章后更新(这本书中的句子是

中的句子所证实的。

构造函数函数具有宽度,高度和可选元素函数,用于填充初始值。

此类具有3个参数,适用于"强制"。

第三个是名为"元素"的回调函数是可选的,并且具有"(x,y(=>未定义"的默认值。因此,如果您在构建"矩阵"类的新实例时没有通过第三个参数,则将是默认的。

如果您在此处传递特定功能(例如(

let myMatrix = new Matrix(100,100,(x,y) => x * y);

在此阶段

this.content[y * width + x] = element(x, y);

它将将相应的值返回到新"矩阵"实例的" this.content"属性的各个数组插槽。

因此,您的矩阵将具有这样的"内容"属性(例如(:

myMatrix.content[0] = 0;
myMatrix.content[1] = 0;
...
myMatrix.content[101] = 1;
myMatrix.content[102] = 2;
// and so on

否则,如果创建新实例时未传递任何函数,则将分配所有生成的" this.content"属性的数组插槽,因为

的默认属性值

(x,y(=>不确定

最新更新