13 回答

TA貢獻1036條經(jīng)驗 獲得超461個贊
給一下兩種情況下的示例代碼,我覺得應(yīng)該是不加的 ?除非這么寫 window.onload=function(){ xxxxxx };

TA貢獻6條經(jīng)驗 獲得超6個贊
先來看一下代碼:
<body?onload="hello();"> <script?type="text/javascript"> function?hello(){ alert("Hello"); } </script> </body>
body里面的onload="hello()",此時如果你不加括號,它就變成一個字符串,沒有意義。實際上寫在html標簽里的js代碼是一種偽協(xié)議,可以寫成這樣<body onload="javascript:hello();">,只不過是省略寫法而已,通過識別后面的括號來調(diào)用函數(shù)才能執(zhí)行。
比如:
<body?onload="(function(){alert(123)})()"><!--這樣可以執(zhí)行,其中括號的方式表示立即執(zhí)行此匿名函數(shù)--> <body?onload="function(){alert(123)}"><!--這樣不可以執(zhí)行,因為后面沒有括號,它只是一個字符串-->
以上是行內(nèi)代碼調(diào)用函數(shù)為什么要加括號的原因。
下面再看一段代碼:
function?hello(){ alert("Hello"); } window.onload?=?hello;
這里的window.onload調(diào)用函數(shù)是不用加括號的,加了括號可以成功的原因是因為通常我們把JS代碼都放到了最后面,頁面也已經(jīng)加載完了,或者沒有涉及到頁面對象的操作情況,所以才沒有報錯。
可以看看這個錯誤的例子:
<script?type="text/javascript"> function?hello(){ var?a?=?document.getElementById("text"); a.innerHTML?=?"Hello"; } window.onload?=?hello();//這種情況就會報錯了,因為JS是先執(zhí)行后才加載下面的文檔內(nèi)容。你把DIV放到JS代碼塊前就不會報錯。 </script> <div?id="text"></div>
為什么會這樣呢,因為window.onload = hello()這種賦值的語句的從右到左,也就是先執(zhí)行了hello(),然后把hello函數(shù)執(zhí)行結(jié)果(如果右return的話)賦值給window.onload,跟你直接寫hello()沒什么區(qū)別。所以嚴格來說window.onload要調(diào)用的函數(shù)是不能加括號的,避免錯誤。
window.onload是一個事件,它表示在頁面加載完后執(zhí)行它指向的代碼,所以不需要給函數(shù)加括號去調(diào)用,頁面加載完會自動去調(diào)用。
function?hello(){ ????alert("Hello"); } window.onload?=?hello; //上面的代碼完全等價于下面的代碼 window.onload?=?function?hello(){//但是這樣寫的話就沒必要給函數(shù)命名,因為其他地方?jīng)]有調(diào)用到 ????alert("Hello"); }

TA貢獻5條經(jīng)驗 獲得超4個贊
不加括號是方法的聲明,加了括號是方法的調(diào)用;
例如:
var? init = function(){
};//聲明
init();//調(diào)用

TA貢獻12條經(jīng)驗 獲得超7個贊
window是瀏覽器類自帶的對象,這個onload是window的一個屬性,這個屬性表現(xiàn)為一個function,你可以看一下js類的寫法。也就是說window有一個默認的onload方法。上面的寫法就是在重寫onload方法,類似于java里面的匿名方法。表示頁面加載完所有的文件后,執(zhí)行此方法。onload本身只是一個變量,不具有任何實際的意義,所以如果要把onload定義為一個方法,那么必須寫出具體的方法體:window.onload=function(){//方法體},這樣才是完整的聲明方式;換一種理解方式,如果onload是一個值,那么你就必須寫成window.onload="abc";道理都是一樣的,只看怎么理解,唯一的區(qū)別就在于js的屬性對象可以定義為function。

TA貢獻5條經(jīng)驗 獲得超0個贊
加括號是匿名函數(shù)了 ?意思是把定義的不加括號函數(shù),和函數(shù)調(diào)用 2段寫為一段了 才產(chǎn)生了這樣的情況

TA貢獻23條經(jīng)驗 獲得超16個贊
function?myFun(){ ????return?1; } var?x?=?myFun;?//賦值操作,x是myFun函數(shù) var?y?=?myFun();//執(zhí)行操作,y是myFun函數(shù)的執(zhí)行結(jié)果?5
添加回答
舉報