藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年8月25日 8:28

求教大大

setTimeout("timego()",1000)中的timego函數,如果換成setTimeout(timego(),1000)就出錯,換成setTimeout(timego,1000)就正常,還有window.onload=timego 正常,window.onload=timego()就不正常  
能解釋一下嗎

window.onload=xxx
後面得是函數的引用。比如timego,或者function(){timego();}

加()與不加有什麼區別啊?為什麼window.onload=timego()就不行?

000

1.setTimeout("xxxxxx",1000),是說1000ms以後執行一個語句系列,如"var a=100,b=10;alert(a+b)",上例中你的語句是"timego()",如此而已

2.setTimeout(xxx,1000),這時候js仍認為xxx是指向語句系列的指針,xxx是函數名,則指向函數體語句,如果是字體串變量名,則指向字符串實體

3.setTimeout(xxx(),1000)會出錯,因為函數xxx()會首先執行,它的返回值作為setTimeout所要求的語句的指針,這個跟alert(myfunc())會alert函數myfunc的返回值是一個道理

在1里,對於setTimeout來說,你給它的也是一個字符串的指針,這個指針指向解釋器分配的一個存儲空間,你的語句被放在那個空間裡

看下面的例子,有六種看似完全不同的寫法(注意這裡的setTimeout(xxx(),1000)為什麼也是對的),對於setTimeout來說,第一個參數都是語句序列的指針,沒有本質的不同

[code]
var x="alert('from variable')"
function func1(){
    alert("from function");
    }
function func2(){
    return "alert('from return-value of function')";
    }
setTimeout("alert('from statements')",1000);
setTimeout("func1()",1000);//實際上也是from statements
setTimeout(x,1000);
setTimeout(func1,1000);
setTimeout(func2(),1000);
setTimeout(function(){alert("from anonymous function")},1000);
[/code]

  謝謝樓上的,那window.onload呢
為什麼window.onload=timego可以
而window.onload=timego()或者 window.onload="timego()"不行了


因為onXXXX形式的跟setTimeout不同
你賦給它的一定要是一個函數,而不能是字符串

原理上,setTimeout對第一個參數指定的字符串調用eval,對於onXXXX=func,事件觸發的時候,調用的形式是func()

window.onload=timego()將timego的返回值賦給window.onlaod,而window.onload="timego()"賦給window.onload一個字符串,而非函數
[html]
<script>
function timego(){
  var t=function(){
    alert("from function as function's return value");
    }
  return t;
  }
window.onload=timego()
</script>
[/html]

setTimeout(function(){alert("from anonymous function")},1000);這句怎麼也可以?

function(){...}
這種寫法是匿名函數,我對這個東東的理解是它定義了一個匿名函數(也就是這個函數沒有名字:D),並返回一個[b]引用[/b]。

Sheneyan在上個帖子中說
  

nod
我上面的"語句序列指針"之說不過是要給出一個盡量明瞭的解釋,把各種形式統一起來
引用這個說法專業得多

<script language="javascript">
function timego()
                  {        
                    document.body.innerHTML=Math.random();
                 
                  setTimeout(timego,200);
            }
</script>
<body onload=timego()></body>可以
<body onload="timego()"></body>可以
<body onload=timego></body>就不可以
<body onload=function timego()
                  {        
                    document.body.innerHTML=Math.random();
                 
                  setTimeout(timego,200);
            }></body>也不可以
我想問body 中的onload事件的具體用法,都搞糊塗了
window.onload=function timego()
                  {        
                    document.body.innerHTML=Math.random();
                 
                  setTimeout(timego,200);
            }就可以
window.onload 與body裡的onload似乎很不一樣window.onload=timego可以而body中就不行,body中可以的window.lonload就不可以

<body onload="">和window.onload=首先長得就不一樣,一個在標籤裡,一個在腳本裡

不必想得太複雜:
標籤裡的onevent=xxxx(帶不帶引號一樣,如果沒空格),只能是可直接執行的語句(比如說函數名後面加括號)
腳本中的onevent=xxxx,只能是函數或者匿名函數的引用
setTimeout(xxxx,1000),跟onevent=xxxx不是一回事,看上面的回復

[html]
<body>
<script>
function test(){alert("good")}
document.body.onload=test;
</script>
</body>
[/html]
[html]
<body>
<script>
document.body.onload=function(){alert("good")}
</script>
</body>
[/html]
[html]
<body onload=test()>
<script>
function test(){alert("good");}
</script>
</body>
[/html]
[html]
<body onload=alert("good")></body>
[/html]

這麼說吧。。。
[code]<body onload="xxx">...[/code]
這種寫法裡面[b]="..."[/b]這個是字符串,如何解析由瀏覽器決定,一般是作為js語句執行。
[code]window.onload=...[/code]
這種寫法,本身就是js語句。它自然得遵循js的規則,window.onload需要的值是[b]引用[/b]之類.

好牛




Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com