作為學前端的小白,剛開始學到函式作為引數傳遞時,簡直一臉的懵逼,為什麼有時候要加括號,有時候又不用,特別是遇到setinterval的時候。
下面是參考網上的一些答案,做的一些總結【要是有什麼錯誤不合理的地方,煩請指正哦】:
1、首先要理解一點,函式是一種叫做function引用型別的例項,因此函式是乙個物件。物件是儲存在記憶體中的,函式名則是指向這個物件的指標,是指標。
2、所以基於這一點,將函式名賦值給乙個變數,相當於變數存貯的是函式這個物件的指標。而如果函式名後面加上圓括號就表示立即呼叫(執行)這個函式裡面的**(花括號部分的**)。下面的例子:
function
fun()
var a=fun //a是fun函式;(不加括號可認為是檢視函式完整資訊,即檢視整個函式體,返回值即整個函式體,不加括號傳參相當於傳入函式整體)
var b=fun() //b是返回值5;(加括號表示傳入函式的返回值);
再來乙個例子:
id="btn1">按鈕1button>
id="btn2">按鈕2button>
var obtn1 =document.getelementbyid("btn1");
var obtn2 =document.getelementbyid("btn2");
obtn1.addeventlistener("click",fn1)
obtn2.addeventlistener("click",fn2());
function
fn1()
function
fn2()
script>
來自網上的乙個例子,我覺得能理解這個例子的話,就真的理解了:
function
hi();
};
var aaa = hi();
var bbb = hi;
aaa();
aaa();
bbb();
/**答案:aaa 是將 hi() 的執行結果賦值給它,即 return 返回的匿名函式,此時有乙個閉包,則每次呼叫 aaa 時都訪問的同乙個 a,aaa() 第一次執行結果為 1,第二次為2
而 bbb 將是將 hi 這個函式名賦值給它,則呼叫 bbb() 後返回乙個函式表示式,即function();*/
再下面是使用setinterval時的情況:
function fun()
setinterval("fun()",2000);//全域性作用域下正常執行
setinterval(fun(),2000); //呼叫函式正常,setinterval呼叫出錯
setinterval(fun,2000); //正確
第一種:【setinterval(「fun()」,2000);】這種加引號的呼叫就可以理解為「可執行**」 ,就行eval 一樣去執行。第乙個引數,就是對fun方法的呼叫 。但是但是,這只能在全域性作用域下使用,在window.onload下會報錯,就是作用域的問題:
window.onload=function
() setinterval("fun()",2000);//執行報錯:(program):1 uncaught referenceerror: fun is not defined
}
第二種:【setinterval(fun(),2000); 】這種的話fun函式只會執行一次,在定時器還沒開始就執行了,原因就是跟最前面的說的一樣,加括號的函式作為引數,直接執行函式體,所以沒有什麼意義。
第三種:【setinterval(fun,2000);】這種是使用定時器比較常用的正確呼叫,每隔兩秒執行一次fun函式。
總結起來:函式作為引數,加括號的,有返回值的就返回返回值,沒有返回值的就是立即執行函式體;不加括號的,傳的是函式的位置,即指標。
函式作為引數傳遞
1.當函式作為引數傳遞時,一般使用函式指標 下面是例子 include typedef int func int x,int y 定義函式指標,指向引數為int x int y 返回值為int的函式 intfunc1 int x,int y 函式func1,引數為int x int y 返回值為in...
指標作為函式引數傳遞
值傳遞,指標傳遞?這幾天在學習c過程中,在使用指標作為函式引數傳遞的時候出現了問題,根本不知道從何得解 源 如下 createnode binnode tree,char p 該 段的意圖是通過乙個函式建立乙個二叉樹的節點,然而在,呼叫該函式後,試圖訪問該節點結構體的成員時候,卻發生了記憶體訪問錯誤...
陣列作為函式引數傳遞
陣列有兩個特殊的性質。一是不能複製陣列 二是使用陣列名字時,陣列會自動轉化為指向其第乙個元素的指標。由於陣列不能複製,所以無法編寫使用陣列型別形參的函式,因為陣列會被自動轉化為指標。一 一維陣列 1.三種定義形式 void printvalues int void printvalues int v...