JavaScript保留字: "preset"

12

我有一个包含下拉选择框的表单,我的 select 标签看起来像这样:

<select name='preset' onchange='preset(this);'>

现在我的 JavaScript 函数只是执行 alert('test');。当我改变下拉框中的选项时,我收到一个错误,显示“preset 不是一个函数”。是的,我确认了它的拼写是正确的,我甚至在页面加载时以一般调用方式调用了它,并得到了我的警告。

如果我把函数名改成别的,比如 presetx,它就可以正常工作了。所以我想也许“preset”是 JavaScript 中的某种保留字,但我似乎找不到任何关于这个的信息。为什么会发生这种情况呢?

更新内容

目前我的测试页面上除了表单和函数以外没有其他任何代码或框架引入,所以我知道不是那方面的问题。

1个回答

15
一些浏览器将具有name属性的元素映射到全局变量。 因此,<select name='preset' onchange='preset(this);'>在某些浏览器中实际上创建了一个全局属性preset。 这会覆盖preset函数。
由于preset现在是HTMLSelectElement对象而不是函数,因此会出现“不是函数”的错误。

啊,那很有道理,我怎么会错过那个 :/ - newbiejsperson
6
因为这是一个愚蠢的反功能特性,本不应该存在,并且本不应该被引入到W3C标准中。但我扯远了…… - lonesomeday
2
哎呀,我从来不知道这个。JavaScript 有自己的 register_globals(虽然比 PHP 的危险性小一些)。 - Michael Berkowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接