1

我正在编写一个greasemonkey 脚本来格式化数千个youtube 视频的观看次数。我格式化粗略数字的功能做得很好。我的问题是通过匿名函数设置格式化的数字。这是我正在尝试的...

function main(arg){
  var viewCount = new Array();

  for(var i=0; i < arguments.length; i++){
      var viewCount = Format(document.getElementsByClassName(arguments[i])[i].textContent);
//  (function(){document.getElementsByClassName(arguments[i])[i].innerHTML = viewCount[i]})();          
  }
}

现在,这是一件棘手的事情。在 Firebug 上调试它,当我删除匿名函数的注释时,即使是 var viewCount 也会收到错误消息“ReferenceError:引用未定义的属性参数 [i]”。但是当评论它回来时,它会按预期设置。

这是我做的一个完整的测试平台:http: //pastebin.com/JRPRQnv6

4

1 回答 1

2

arguments [MDN]是每个函数中的一个特殊变量。您没有将任何参数传递给匿名函数,因此它是一个空对象。

如果arguments要从外部函数访问对象,则必须存储对它的引用。

例子:

 function main(arg){
  var viewCount = new Array();
  var args = arguments;

  for(var i=0; i < arguments.length; i++){
      var viewCount = Format(document.getElementsByClassName(arguments[i])[i].textContent);
      (function(){
          document.getElementsByClassName(args[i])[i].innerHTML = viewCount[i];
      })();          
  }
 }

但我完全看不出有理由在这里使用立即函数。另一个潜在问题是您正在访问 的i第 th 元素.getElementsByClassName,其中i是参数的循环索引。.getElementsByClassName甚至可能不会返回这么多元素(即您为错误的列表使用了错误的索引)。

也许你打算这样做:

for(var i=0; i < arguments.length; i++){
    var elements = document.getElementsByClassName(arguments[i]);
    for (var j = 0, l = elements.length; j < l; j++) {
        elements[j].innerHTML = Format(elements[j].textContent);
    }
}
于 2013-01-12T13:49:10.453 回答