【问题标题】:Rhino does not enumerate 'arguments' to a functionRhino 不会枚举函数的“参数”
【发布时间】:2011-08-10 05:26:59
【问题描述】:

我正在尝试使用函数可用的“参数”变量来枚举传递给函数的参数,在 Javascript 中,使用:

for (var i in arguments){
   ...
}

这似乎适用于我在 chrome 和 firebug 控制台中,而不适用于 Rhino。使用前两个,我可以成功进入for循环并查看参数,而使用后者,似乎甚至没有进入for循环。

为什么会发生这种情况,我该如何防止这种情况发生?

【问题讨论】:

  • 你能确认 arguments 包含你认为的值吗?
  • 我会期望从arguments评估的对象至少具有length和caller和callee属性...因为这些是需要每个规范。请注意,for(var x in arrLikeThing) 形式通常是不正确的代码。与for(var i = 0; i < argumets.length; i++) { var arg = arguments[i]; ... }比较。
  • 嗨 Thilo,是的 - 这是来自我的终端的 sn-p:abhinav@abhinav:~/js_codes$ cat testfunc.js function main(){ for(var i in arguments) print(i); } a = main("javascript", "rocks"); abhinav@abhinav:~/js_codes$ rhino testfunc.js abhinav@abhinav:~/js_codes$
  • 但是(对于海报),FF5 中的function x () { var i = 0; for(var x in arguments) { i++ }; return i }; alert(x(...)) 将返回 0,其中 ... 是 `` 和 1,其中 ... 是 "hello",等等。第一条评论具有误导性;仅仅因为一个对象有一个属性并不意味着该属性必须用for...in 枚举。我不确定规范说的是什么。 arguments 在此。 (看看上面的代码如何在 Rhino [例如在 FF 之外] 运行会很有趣。)
  • 对答案感兴趣的朋友,stackoverflow.com/questions/4824207/…这回答了这个问题。

标签: javascript linux rhino jvm-arguments enumerate


【解决方案1】:

来自Javascript for..in looping over arguments ie.for( arg in arguments) does not work in IE8 but it works in Chrome 8:

首先,虽然函数中可用的 arguments 对象不是数组,但它足够“类似数组”,因此增量 for 循环 (for (var i = 0, len = arguments.length; i

要真正回答为什么第二个循环不起作用的问题,重要的是要了解 for ... in 循环的作用:它遍历对象中的所有可枚举属性。现在,我在该声明中加粗了 2 个词,因为我有目的地使用这两个词来表示一些细微差别,虽然它们可能看起来很微妙,但如果你没有意识到发生了什么,它们会极大地影响你的代码的行为.

首先让我们关注所有方面——我的意思是说,不仅仅是对象本身的属性,还包括该对象从其原型或原型的原型等继承的潜在属性。出于这个原因,通常建议您通过立即附加条件 if (obj.hasOwnProperty(p)) 来“保护”任何 for ... in 循环(假设您的循环是为 (var p in obj) 编写的))。

但这不是你在这里遇到的。为此,让我们关注第二个词,可枚举。 JavaScript 中对象的所有属性要么是可枚举的,要么是不可枚举的,这几乎直接关系到属性是否出现在 for ... in 循环中。事实证明,在 Firefox 和 IE 等浏览器中,arguments 对象的数字属性是不可枚举的(它的长度也不是),这正是您不遍历任何东西的原因!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2010-09-16
    相关资源
    最近更新 更多