2013-12-13 26 views
0

以下代碼不起作用,因爲var clock_socket不在start函數之外。這很明顯,但爲什麼呢?我認爲如果函數內部不存在其他具有相同名稱的變量,則外部變量在函數內部「可見」。在函數外部看不到Javascript變量

var clock_socket = document.getElementById("clock"); 

var start = function(){ 

    var hour = new Date(); 
    clock_socket.innerHTML = hour.toLocaleTimeString(); 

} 

var emp = setInterval(function(){start()},1000); 
+4

工作是什麼讓你認爲代碼不起作用?它[作品](http://jsfiddle.net/63FYz/),顯然。也許你試圖在DOM尚未存在的時候獲取元素,不是嗎? – raina77ow

+2

根據代碼所在的位置(或者如果它位於DOM準備好的塊內)很重要。如果你正在做'var clock_socket ='賦值,然後存在ID爲「clock」的div,那麼這可能解釋爲它不起作用。 –

+0

我知道這行不通,因爲我試過了。但你們都可能是對的,因爲我把這些代碼放在html的頭部。謝謝! – Rodolfo

回答

0

你在這裏看到的並不是函數作用域的問題,你可能會想。 該函數可以看到您定義的全局變量,但是如果DOM尚未完全加載,則不會。

解決您的問題儘量包住你的函數像這樣(如果你正在使用jQuery)

jQuery(document).ready(function(){ 

    var clock_socket = document.getElementById("clock");  
    var start = function(){ 
     var hour = new Date(); 
     clock_socket.innerHTML = hour.toLocaleTimeString(); 
    } 
    var emp = setInterval(function(){start()},1000); 

}) 

另一種建議是把你的腳本在身體標記結束或調用事件當文件準備就緒時聽衆。

希望這有助於你

+0

我建議在使用完全使用jQuery的時候。例如: '$(「#clock」)。text(hour.toLocaleTimeString());' '.innerHTML'和'getElementById'都不需要。 –

+0

@CFairweather,是的,我想你是對的這個:) – xhallix

+0

我會重新回到電腦上完成這篇文章 – xhallix

0

Crhistoph的答案是偉大的,但以防萬一你不使用jQuery的嘗試<head>

(function(){ 
    var load, unload; 
    load = function() { 
    // setup all your stuff here 
    }; 
    unload = function() { 
    // unset or cleanup 
    }; 
    window.addEventListener('load',load,false); 
    window.addEventListener('unload',unload,false); 
}()); 

這在寫作時下面的代碼當然可以改善,但它保證在window.onload事件