Function在JavaScript中函數是一種對象,函數名是指向對象的引用。可以用一下方式調用它
var fun = new Function(“參數”,”傳回值”,”函數體”);
因此如果出現下面這種情況,就已很好理解了。第二個函數重寫了第一個函數,可以理解為第二個對象覆蓋了第一個對象。函數名只是引用,doAdd變數改變了引用的地址。
var doAdd = new Function(“iNum”, “alert(iNum + 20)”);
var doAdd = new Function(“iNum”, “alert(iNum + 10)”);
可以使用 ‘函數名.length’ 返回參數的數量:
//函數將輸出1 function show(num){ alert(show.length); };
arguments
函數的一個內建屬性。arguments類似一個數組,訪問該函數的實參,實參的數目不一定等於形參
function show(x,y,z){ alert(arguments.length); //返回 4 alert(arguments[2]); //返回 c alert(show.length); //返回 3 arguments[0] = 'f'; alert(x); //返回 f }; show('a','b','c','d');
arguments.callee
返回此arguments對象所在的當前函數引用
比如,遞迴演算法時函數本身,arguments.callee表示函數本身
//計算num的階乘 function sum(num){ if(num<=1) { return 1; }else{ return num*arguments.callee(num-1); } } alert(sum(4));
函數的toString() 和 ValueOf()返回函數的原始碼 call apply
改變函數的範圍
二者的異同:
apply() : 接收兩個參數,一個是函數啟動並執行範圍(this),另一個是參數數組。
call() : 第一個參數與apply()方法相同,但傳遞給函數的參數必須列舉出來。
<script> var name = "tom"; function show(){ alert("hello "+this.name); //this必須加上,否則會成為全域變數 } var obj = { name:"jerry" } show.call(window); show.call(obj);</script>
結果: hello tom —> hello Jerry this
JavaScript中的this與c++中的不同,this可以改變,對於函數fun(),如果用obj.fun()調用他,那麼函數fun中得this就是obj對象,但是call(),apply()可以改變函數中的this。例如:
fun.call(window);
fun.call(this); // 此時的this就是window
這時fun函數中的this變成了了window 範圍
函數A體內包含其他函數B,只有在函數A的範圍內才能調用B
<script> function A(){ B(); function B(){ alert("This is function B"); } } A(); </script>
沒有塊級範圍
if(){} 沒有封閉範圍的功能
if(true){ var temp = "sss"; } alert(temp);//結果是sss
for(;;){} i和內部的變數都是全域的
for(var i=0;i<10;i++){ var temps = "for"; } alert("i:"+i+"temps:"+temps);//結果是i:10 temps:for
在函數中變數加上var是局部變數,不加var就是全域變數。函數使用變數時,先從本地的範圍中搜尋,如果沒有搜尋到就到上一層範圍中搜素。所以,訪問局部變數要比全域變數快
PS:
1,基本類型不能加屬性(只有Object是引用)
2,基本類型儲存在棧記憶體中,參考型別儲存在堆記憶體中,基本類型的賦值時複製了整個內容,而參考型別的賦值只是地址的複製
3,所有函數的參數都是按值傳遞的,對象傳的值是地址因此外部的對象也會變化
4,instanceof 類型 判斷類型不能檢查基本類型