|
藍森林 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]之類. |
好牛 |
|