【问题标题】:How to pass parameter by variable in JAVASCRIPT如何在 JAVASCRIPT 中通过变量传递参数
【发布时间】:2017-08-03 00:09:15
【问题描述】:

在高级模式下通过closure-compiler 优化我的 JS 时收到警告消息并且未编译。

JSC_TYPE_MISMATCH:实际参数 1 Document.prototype.getElementById 与形参不匹配

我的 js 函数来改变 div 的类

for (kx = 1; kx <= 5;kx=kx+1) {
document.getElementById(kx).className='newclass';
    }

在 HTML 中我有五个 div 如下

<div id='1' class ='first'> contents </div>
<div id='2' class ='first'> contents </div>
<div id='3' class ='first'> contents </div>
<div id='4' class ='first'> contents </div>
<div id='5' class ='first'> contents </div>

此代码在正常情况下工作(没有压缩/优化),但在尝试优化它时显示警告/错误,我该如何修复它?

【问题讨论】:

  • 我认为这是 Closure 中的一个错误,因为您所做的将在实际浏览器中完美运行。 HTML5 之前的规范认为“id”属性应该是有效的标识符,但在 HTML5(以及所有现代浏览器)中并非如此 - 任何没有嵌入空格的字符串都是有效的。
  • @Pointy 我认为这与type of the argument有关。
  • @canon 是的,我同意,但我的意思是警告只是噪音,因为(如您所述)代码将起作用。

标签: javascript optimization google-closure-compiler


【解决方案1】:

Closure 希望您将 string 传递给 document.@987654321@ 而不是 number

JSC_TYPE_MISMATCH:实际参数 1 Document.prototype.getElementById 与形参不匹配
找到:数字
必需:字符串
第 3 行字符 24

document.getElementById(kx).className='newclass';

因此,将kx 显式转换为string1 应该会删除该警告:

for (kx = 1; kx <= 5; kx++) {
    document.getElementById(kx.toString()).className='newclass';
}

不过,我不知道我会打扰;原来的实际编译。您收到的是警告而不是错误(我怀疑),因为数字参数只会被强制转换为字符串。也就是说,如果您的环境将警告升级为错误,那么无论如何......跳过箍。

1 值得注意的是,您可以通过简单地连接一个空字符串(即:''+kx,并允许type-coercion 来做它的事情)将数字转换为字符串。我选择使用Number.prototype.@987654323@,因为就示例而言,方法调用更清楚地表明了意图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 2015-08-28
    • 2014-11-07
    • 1970-01-01
    • 2018-06-28
    • 2011-07-23
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多