我如何才能弄清楚javascript内置函数的调用和绑定行为



我试图理解这段代码。CCD_ 1。问题是,这种行为很难理解,因为没有办法看到数字的实现。如果你尝试.toString Number,它只会说"本地代码";。对内置函数使用绑定和调用也是如此。我怎么能知道这应该是怎么回事?

如果您想详细了解Number是如何工作的,请查看其ECMAScript规范。

如果您想了解Number的一般工作原理,请查看其MDN文档。

基本上,Number(value)所做的就是将value转换为数字类型。没有别的。

我相信,要理解这段代码,您需要了解的实际上是关于Function.prototype.call而不是Number

当我们把上面的代码翻译成一个不那么花哨的代码时,我们得到的大致如下(这对下面的解释很重要(:

console.log(
Array(8).fill(0).map(Function.prototype.call, Number)
);

现在,在.map中,它接收两个参数:

  1. 回调,有3个参数:currentValueArray(8).fill(0).map(Number.call, Number)0、originalArray
  2. 自定义this

因此,上面的代码所做的是传递Number.call作为回调,并传递Number作为自定义此值。

如果您理解.call方法,您就会知道它必须至少接收1个参数:

  1. this
  2. 。。。参数n

了解了所有这些,我们现在可以将上面的代码翻译成更不花哨的代码:

console.log(
Array(8).fill(0).map(function(currentValue, currentIndex, originalArray){
return this.call(currentValue, currentIndex);
}, Number)
);

这也可以翻译成更不花哨的:

console.log(
// Making `currentValue` into `_` because its existence does not matter in this case
Array(8).fill(0).map(function(_, currentIndex){
return Number.call(_, currentIndex);
})
);

现在,最后的翻译,这是最容易理解的一个:

console.log(
Array(8).fill(0).map((_, i) => Number(i))
);

最新更新