① js函數定義方式的區別
1:調用關鍵字function來構造
functiondistance(x1,x2,y1,y2)
{
vardx=x2-x1;
vardy=y2-y1;
returnMath.sqrt(dx*dx+dy*dy);
}
2:使用Function()構造函數(請注意與上面的大小寫)
varf=newFunction*"x","y","returnx*y");
這行代碼創建了一個新函數,該函數和你所熟悉的語法定義的函數基本上時等價的:
functionf(x,y)
{
returnx*y;
}
Functino()構造函數可以接受任意多個字元串參數。它的最後一個參數時函數的主體,其中可以包含任何javaScript語句,語句之間用分號分隔。其他的參數都是用來說明函數要定義的形式參數名的字元串。如果你定義的函數沒有參數,那麼可以只需給構造函數傳遞一個字元串(即函數的主體)即可。
注意,傳遞給構造函數Function()的參數中沒有一個用於說明它要創建的函數名。用Function()構造函數創建的未命名函數有時被成為「匿名函數」。
你可能非常想知道Function()構造函數的用途是什麼。為什麼不能只用function語句來定義所有的函數呢?原因是Function()構造函數允許我們動態地建立和編譯一個函數,它不會將我們限制在function語句預編譯的函數體中。這樣做帶來的負面影響效應就是每次調用一個函數時,Function()構造函數都要對它進行編譯。因此,在循環體中或者在經常使用的函數中,我們不應該頻繁地調用這個構造函數。
使用Function()構造函數的另一個原因是它能夠將函數定義為JavaScript表達式的一部分,而不是將其定義一個語句,這種情況下使用它就顯得比較的方面,甚至可以說精緻。
3:函數直接量
函數直接量是一個表達式,它可以定義匿名函數。函數直接量的語法和function語句非常相似,只不過它被用作表達式,而不是用作語句,而且也無需指定函數名。下面的三行代碼分別使用function()語句、Funciont()構造函數和函數直接量定義了三個基本上相同的函數:
functionf(x){returnx*x};
varf=newFunction("x","returnx*x;");
varf=function(x){reurnx*x};
在JavaScript1.1中,可以使用構造函數Function()來定義函數,在JavaScript1.2和其後的版本中,還可以使用函數直接量來構造函數。你應該注意這兩種方法之間的重要差別。
首先,構造函數Function()允許在運行時動態地創建和編譯JavaScript代碼。但是函數直接量卻是函數結構的一個靜態部分,就像function語句一樣。
其次,作為第一個差別的必然結果,每次調用構造函數Function()時都會解析函數體並且創建一個新東漢數對象。如果對構造函數的調用出現在一個循環中,或者出現在一個經常被調用的函數中,這種方法的效率非常低。另一個方面,函數直接量或出現在循環和函數中的嵌套函數不是在每次調用時都被重新編譯,而且每當遇到一個函數直接量時也不創建一個新的函數對象。
Function()構造函數和函數之間量之間的第三點差別是,使用構造函數Function()創建的函數不使用詞法作用域,相反的,它們總是被當作頂級函數來編譯,就像下面代碼所說明的那樣:
② js如何知道函數名調用函數
str = "func_abc";
//調用func_abc
eval(str);
如果要傳抄參數,比如
eval( str + "( '字元串參數', 123 )" );
也可以
eval( "var _function = " + str );
_function( "字元串參數", 123 );
沒有參數就
_function();
③ 如何通過一個js方法的方法名,獲取到這個js方法定義的代碼(方法體)
可以使用抄js的eval函數實現襲,示例如下:
<script type="text/javascript">
//自定義函數,用於彈出三個參數的值
function alertFunc(str1,str2,str3){
alert(str1);
alert(str2);
alert(str3);
}
//自定義函數:根據傳入的函數名,調用函數
function callAlert(functionName){
//根據函數名得到函數類型
var func=eval(functionName);
//創建函數對象,並調用
new func(arguments[1],arguments[2],arguments[3]);
}
</script>
<!--編寫按鈕,在點擊事件中調用函數-->
<button onclick="callAlert('alertFunc','tom','hello','world')" >測試函數調用</button>