Array.prototype.forEach替代实现参数

发布于 2024-12-19 11:11:06 字数 833 浏览 3 评论 0原文

当我开发最新的 Web 应用程序并需要使用 Array.forEach 函数时,我不断发现以下代码用于添加对没有内置该函数的旧版浏览器的支持。

/**
 * Copyright (c) Mozilla Foundation http://www.mozilla.org/
 * This code is available under the terms of the MIT License
 */
if (!Array.prototype.forEach) {
    Array.prototype.forEach = function(fun /*, thisp*/) {
        var len = this.length >>> 0;
        if (typeof fun != "function") {
            throw new TypeError();
        }

        var thisp = arguments[1];
        for (var i = 0; i < len; i++) {
            if (i in this) {
                fun.call(thisp, this[i], i, this);
            }
        }
    };
}

我完全理解什么代码的作用及其工作原理,但我总是看到它被复制并注释掉了正式的 thisp 参数,并使用 arguments[1] 将其设置为局部变量。

我想知道是否有人知道为什么要进行此更改,因为据我所知,使用 thisp 作为形式参数而不是变量,代码可以正常工作?

When working on my latest web application and needing to use the Array.forEach function, I constantly found the following code used to add support to older browsers that do not have the function built in.

/**
 * Copyright (c) Mozilla Foundation http://www.mozilla.org/
 * This code is available under the terms of the MIT License
 */
if (!Array.prototype.forEach) {
    Array.prototype.forEach = function(fun /*, thisp*/) {
        var len = this.length >>> 0;
        if (typeof fun != "function") {
            throw new TypeError();
        }

        var thisp = arguments[1];
        for (var i = 0; i < len; i++) {
            if (i in this) {
                fun.call(thisp, this[i], i, this);
            }
        }
    };
}

I fully understand what the code does and how it works, but I always see it copied with the formal thisp parameter commented out and having it be set as a local variable using arguments[1] instead.

I was wondering if anyone knew why this change was made, because from what I can tell, the code would have worked fine with thisp as a formal parameter rather than a variable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

沫雨熙 2024-12-26 11:11:06

Array.prototype.forEach.length 定义为 1,因此如果设置了 .length 属性,实现函数将更加原生也到1

http://es5.github.com/#x15.4.4.18

forEach方法的length属性是1。

func.lengthfunc 根据其定义采用的参数量。)

对于 func.length< /code> 为 1,您必须定义 func 仅接受 1 个参数。在函数本身中,您始终可以使用 arguments 获取所有参数。但是,通过将函数定义为采用 1 个参数,.length 属性为 1。因此,根据规范,它是更正确的。

Array.prototype.forEach.length is defined as 1, so implementation functions would be more native-like if they had their .length property set to 1 too.

http://es5.github.com/#x15.4.4.18

The length property of the forEach method is 1.

(func.length is the amount of argument that func takes based on its definition.)

For func.length to be 1, you have to define func to only take 1 argument. In the function itself you can always get all arguments with arguments. However, by defining the function to take 1 argument, the .length property is 1. Therefore, it is more correct according to the specification.

不再见 2024-12-26 11:11:06

这将迭代数组中的每个值,而不迭代原型函数的等效字符串。

Array.prototype.forEach = function(fun /*, thisp*/) {
    if (typeof fun != "function") {
        throw new TypeError();
    }

    for(i = 0; i < this.length; i++){
        ...
    }

}

This will iterate through each of the values in the array without iterating over the string equivalent of prototype functions.

Array.prototype.forEach = function(fun /*, thisp*/) {
    if (typeof fun != "function") {
        throw new TypeError();
    }

    for(i = 0; i < this.length; i++){
        ...
    }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文