2016-10-03 56 views
0

代碼1嵌套函數結構,使setInterval函數unvisible

<html> 
<head> 
<script type="text/javascript"> 
    function showTime(){ 
      var c=document.getElementById("text"); 
      var nowTime=new Date(); 
      c.innerHTML="time is "+nowTime.toLocaleTimeString(); 
      } 
    function startTime(){ 
     setInterval("showTime()",1000); 
     } 

</script> 
</head> 
<body onload="startTime()"> 
<div id="text"></div> 
</body> 
</html> 

它成功地工作,現在在開始時間函數嵌套函數的showTime。

CODE2

<html> 
<head> 
<script type="text/javascript"> 
    function startTime(){ 
     function showTime(){ 
      var c=document.getElementById("text"); 
      var nowTime=new Date(); 
      c.innerHTML="time is "+nowTime.toLocaleTimeString(); 
     } 
     setInterval("showTime()",1000); 
    } 
</script> 
</head> 
<body onload="startTime()"> 
<div id="text"></div> 
</body> 
</html> 

錯誤發生,ReferenceError: showTime is not defined
1.對於代碼1,setInterval函數中雙引號的含義是什麼?
2.對於code2,爲什麼showTime可以從startTime中調用,比如在code1中?

回答

0

我認爲這可能是EVAL範圍問題。

function test() { 
 
    var x = 2, 
 
    y = 4; 
 
    console.log(eval("x + y")); // Direct call, uses local scope, result is 6 
 
    var geval = eval; 
 
    console.log(geval("x + y")); // Indirect call, uses global scope, throws ReferenceError because `x` is undefined 
 
} 
 
test();

內部的setInterval同樣使用eval來確定功能。 因此,由於這種直接和間接調用的行爲,它會拋出一個參考錯誤。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

0

"showTime()"是一個不可調用的字符串。
正確的做法是:

function startTime(){ 
     function showTime(){ 
      var c=document.getElementById("text"); 
      var nowTime=new Date(); 
      c.innerHTML="time is "+nowTime.toLocaleTimeString(); 
     } 
     setInterval(showTime,1000); 
    } 
+0

字符串版本實際上是調用和有效的的setTimeout或setInterval的......使用'的eval()'內部...作用域是行不通的,雖然 – charlietfl

+0

的eval()在內部用來處理這 HTTPS ://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval –

+1

好的,但是當使用'eval()'時,javascript將在全局空間中尋找'showTime',它不是當下。我試過我的解決方案,它的工作原理。 –