function sum(num1,num2){ return num1+num2; } console.log(sum(10,10));//20 console.log(sum); //function sum(num1, num2) console.log(sum()); //NaN var anotherSum=sum; console.log(anotherSum(10,10));//20 sum=null; //使得sum()函數的指針爲空 console.log(anotherSum(10,10));//20 console.log(sum(10,10));//uncaught TypeError: sum is not a function
雖然函數名能夠理解爲指針,可是ECMAScript 沒有函數重載的概念 若是申明瞭同名的函數,則按順序,後面的函數覆蓋掉前面的函數javascript
alert(sum(10,10));//20;由於預先讀取到了sum()函數的申明 alert(sum1(10,10))//報錯,由於找不到sum1()函數; function sum(num1,num2){ return num1+num2; } var sum1=function(num1,num2){ return num1+num2; }
和變量的定義是類似的,缺乏 var 關鍵字,定義的就是全局變量。 可是這兩種寫法都是函數的表達式寫法。java
arguments 是一個數組,主要做用是保存函數參數-----因此javascript函數不在意傳進來什麼類型的參數,也不在意傳進來幾個參數.數組
做用一:能夠直接利用數組訪問參數 ,如arguments[0]
;app
做用二:在遞歸函數中的應用--------arguments.callee()
;函數
這裏重點說明一下arguments.callee();它至關於FunctionaName( )this
function factorial(num){ if (num<=1){ return 1; }else{ return num*arguments.callee(num-1); } }
不用 return num*factorial( num-1)
;的目的就是擔憂函數名在發生變化,程序會出錯 這叫消除緊密耦合現象
prototype
每一個函數都包含length 和prototype 屬性指針
length
用法: FunctionName.length 能夠獲得函數當前傳入的參數個數code
prototype
用法:函數的原型屬性,不少函數的方法依託於這個屬性,也是實現函數繼承的重要因素對象
每一個函數都包含非繼承來的兩個方法:
apply( )
和call( )
;
主要的意義在於:(1)傳遞函數參數(2)擴充函數的做用域
舉個栗子:
//apply()和call()擴充函數做用域,功能:在特定的做用域中調用函數
window.color="red"; var object={ color:"blue"} function sayColor(){ alert(this.color); } sayColor();//red--函數內部做用域中沒有color屬性,便利用函數做用域鏈向上找到全局window.color="red" sayColor.call(this);//red--調用函數內部做用於,找color,沒找到便向上查找找到全局window.color="red" sayColor.call(object);//blue--函數體內部this指針指向object,因此找到 color:"blue" sayColor.call(window);//red--同理找到全局做用域window.color="red"
function declaration hoisting
(函數申明提高) 避免函數的緊密耦合