[英]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.callee
和eval
)?
编辑以获取更多详细信息:
假设我定义了一个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.