繁体   English   中英

当我需要访问变量时,如何不使用 arguments.callee?

[英]How can I not use arguments.callee when I need to access a variable?

假设我正在制作一个 JS 库,其中包含一些用于 DOM 操作的函数。 我有一些添加到元素的函数,例如myElement.empty(); . 我希望NodeList具有相同的功能(例如,从querySelectorAll返回的对象)。 要动态添加功能,我已经完成了以下操作(请注意,以下操作确实有效):

var funcs=["text","html","attr","remove","empty","css"];
var n=funcs.length;
while(~--n){
    var f=function(){
        var i,l=this.length;
        for(i=0;i<l;i++){
            this[i][ funcs[arguments.callee.n] ].apply(this[i], arguments);
        }
        return this;
    };
    f.n=n;
    NodeList.prototype[funcs[n]]=f;
}

这可行,但我听说arguments.callee 在“严格”模式下不起作用

有人说给 function 一个名字,但我不能,虽然我试过:

var funcs=["text","html","attr","remove","empty","css"];
var n=funcs.length;
while(~--n){
    this[funcs[n]]=function(){
        var i,l=this.length;
        for(i=0;i<l;i++){
            this[i][ funcs[name] ].apply(this[i], arguments);
            // In the above it has 'name' which references the function name
        }
        return this;
    };
    NodeList.prototype[funcs[n]]=this[funcs[n]];
}

那没有用。 我能够使用eval来做到这一点。 我决定不使用eval ,尽管它有效(通过将n放入字符串中并从中生成 function )。 我认为arguments.callee可能比eval更好,如果我必须使用其中之一的话。

如何让我的 function 工作而不使用建议的任何东西(例如arguments.calleeeval )?

编辑以获取更多详细信息:

假设我定义了一个empty的 function (再次出于问题的目的,我们假设修改原型是可以的):

Element.prototype.empty=function(){
    while(this.childNodes[0])
        this.childNodes[0].remove();
};

这适用于一个元素。 如果用户想做类似的事情怎么办:

document.querySelectorAll("button .myclass").empty();

所以我想制作一个脚本,为NodeLists动态创建函数,为每个元素调用相应的函数,例如:

NodeList.prototype.empty=function(){
    var i,l=this.length;
    for(i=0;i<l;i++)
        this[i].empty();
    return this;
};

如果我想执行上述操作,我将需要创建许多功能非常相似的功能。 所以我想编写一些代码来为NodeList动态创建函数。 正如您可能在上面所读到的,我使用arguments.callee (和eval )完成了此操作,但我想使用标准且认为可以使用的东西。

我该怎么做?

如果您需要更多信息,请在评论中提问,我会尽快回复。

不要使用那种奇怪的迭代风格,而是一种惯用for … of循环,它允许一个块范围的变量:

const funcNames = ["text","html","attr","remove","empty","css"];
for (const name of funcNames) {
    NodeList.prototype[name] = function(...args) {
        for (let i=0; i<this.length; i++) {
            this[i][name](...args);
        }
        return this;
    };
}

没有理由访问当前的.n或将名称存储在其 .n 属性中,只需通过闭包访问它即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM