尝试在 JavaScript 中实现 Python-Style len()

Trying to Implement Python-Style len() in JavaScript

我在 JavaScript 中阅读了很多关于 call()bind() 的内容,特别是 创建快捷方式 部分 MDN article.

我正在尝试在 JS 中实现以下 Python-esque 函数:

var arr = [1,2,3];
len(arr); // 3

我确实意识到这是一个人为的例子,但我正在努力思考这些方法。以下是我的实现方式:

var len = Function.prototype.call.bind( Array.prototype.slice.length );
len([1,2,3]);

当我 运行 它时,我得到:

len([1,2,344])
^

TypeError: len is not a function
    at Object.<anonymous> (/private/var/folders/j6/3fs5_k3n17z_0j2xrwj6sphw0000gn/T/CodeRunner/Untitled 11.js:2:1)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:311:12)
    at Function.Module.runMain (module.js:467:10)
    at startup (node.js:136:18)
    at node.js:963:3

我在这里缺少什么来理解它是如何工作的?

当您在代码中设置变量 len 时,您实际上是将 len 设置为函数 Function.prototype.call 的副本,其中 this Array.prototype.slice.length 的(上下文)。

我认为您误解了 bind() 的用法。假设我有一个函数 len:

var len = function() {
    return this.length;
};

并且您想获取数组的长度:

len.call([1,2,3]);

在这种情况下,len中的this是数组[1,2,3],因为我们使用call来提供this。假设我们想将该数组永久绑定到该函数并将其存储在我们可以随时使用的变量中:

var myArrayLen = len.bind([1,2,3]);

现在,myArrayLen 基本上是 len 的副本,与 [1,2,3]this 永久绑定。如果我们调用它,它 returns 3.

在你的例子中,Array.prototype.slice.length实际上是函数Array.prototype.slice的长度,对应于number of arguments that can be passed to the function.

没有内置的 length() 函数,所以按照你(公认的)人为的例子,我们只需要创建一个提供长度的函数,将它添加到数组原型,并使用 [= 绑定它29=]:

Array.prototype.len = function () { return this.length; };
var len = Function.prototype.apply.bind(Array.prototype.len);
len([1,2,3]); // 3