2012-04-18 130 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