2012-04-18 90 views
3

我有这个在我看来页:为什么我的功能不是功能?

<input type="checkbox" id="toggle_SITEID" name="@@toggle_SITEID" onclick="toggle_SITEID(this)" /> New <br /> 

然后在我的js文件我有这样的:

toggle_SITEID = function (chk) { 
    // something 
} 

,然后我点击复选框,“东西”将无法运行。我检查萤火虫主机的错误信息是:

toggle_SITEID is not a function

那么为什么呢?

+4

你包括在HTML的JavaScript文件? – djlumley 2012-04-18 04:12:32

+4

它是否在正确的范围内?即'toggle_SITEID'是其他函数中的变量,而不是全局名称空间中的变量? – Ryan 2012-04-18 04:12:36

+0

我怀疑这是一个范围问题,你可以访问整个文件吗? – tobyodavies 2012-04-18 04:12:42

回答

6

可能有几个原因这个错误:

  • 你没有引用脚本的HTML文件。

  • 函数未在全局范围内声明,但在内部范围内声明。
    全球scope- WORKING DEMO
    内部范围 - NON WORKING DEMO

  • 有一个元件,其id相同的函数名(toggle_SITEID)。
    在Internet Explorer中,使用元素的iddocument.getElementById()的快捷方式。通过使用var声明中断链接。

  • 另一个可能出现的问题是,当您有一个内联处理程序尝试使用干扰内联处理程序的唯一作用域链的全局变量时。当这种情况发生的全球...

    • 具有相同的名称与处理元素上的任何财产,或
    • 具有相同的名称作为document

    由于任何财产内联处理程序的作用域链具有元素本身,以及document作为变量对象注入到作用域链中,这些对象的任何属性在访问全局变量时都会产生干扰。

    例如,假设这个元素:<a onclick="foo();">click me</a>,我们可以成功地调用全球foo()除非我们已经做了一些类似document.foo = "bar"。由于document作为范围链中的变量对象注入,document.foo现在会遮蔽全局foo

    与元素本身一样。如果我们在调用全局函数之前将foo属性添加到元素,那么该属性将会影响全局。 <a onclick="this.foo = 'bar'; foo();">click me</a>

+0

问题是他没有关闭他的变量声明,所以函数从未真正设置为变量。我不能从他的例子中看出如何说明函数的作用范围。 – Anthony 2012-04-18 06:02:21

+0

@Anthony。我在你的回答下评论道,你错了。 – gdoron 2012-04-18 06:18:32

+0

也许它没有工作,但我说js是错的。因为将var设置为anon函数并没有完成设置var是没有意义的。你是对的,它确实有效。但是你还没有表明(至少对我而言)你怎么知道他是如何设定他的范围的。你猜根据错误吗? – Anthony 2012-04-18 06:28:12

-2

一件事跳出我:

你不要用分号结束它,即使它是一个匿名函数。在

toggle_SITEID = function (chk) { 
    alert("I work!"); 
}; 

工作演示:

试试这个http://jsfiddle.net/crazytonyi/cDNcu/

+0

那个跳出你的是错误的......你没有测试它。你的小提琴没有分号工作... [检查出来](http://jsfiddle.net/cDNcu/1/) – gdoron 2012-04-18 06:18:14

+2

如果你阅读ecmascript规范:http://www.ecma-international.org/出版物/标准/ ECMA-262。你可以看到分号实际上是完全可选的(尽管像道格拉斯克罗克福德这样的人在你不使用它时会生气)。 – djlumley 2012-04-18 06:30:44

+0

是的,几乎所有我的功能都没有以分号结尾,它仍然在工作 – 2012-04-18 06:53:14