在ECMAScript中,Function(函數)實際上是對象。每個函數都是Function類型的實例,而且都與其他引用類型一樣具有屬性和方法。由于函數是對象,因此函數名實際上也是一個指向函數對象的指針。
<script type="text/javascript"> function box(num1, num2) { return num1+ num2; } var box= function(num1, num2) { return num1 + num2; }; var box= new Function('num1', 'num2' ,'return num1 + num2');//更加具體的說明了函數是對象,會導致解析兩次代碼,盡量少用</script>函數內部屬性
在函數內部,有兩個特殊的對象:arguments和this。arguments是一個類數組對象,包含著傳入函數中的所有參數,主要用途是保存函數參數。但這個對象還有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數。function box(num) { if (num <= 1) { return 1; } else { return num * arguments.callee(num-1);//使用callee來執行自身,防止如果box函數名稱改變時,需要改變內部遞歸函數的民稱 }}函數內部另一個特殊對象是this,其行為與Java和C#中的this大致相似。換句話說,this引用的是函數據以執行操作的對象。PS:當在全局作用域中調用函數時,this對象引用的就是window。<script type="text/Javascript"> var name = "person"; var man = { name:"lisong", sayName:function(){ console.log(this.name); } }; man.sayName();//lisong</script>函數屬性和方法
ECMAScript中的函數是對象,因此函數也有屬性和方法。每個函數都包含兩個屬性:length和PRototype。其中,length屬性表示函數希望接收的命名參數的個數。<script type="text/javascript"> function box(name, age) { alert(name + age); } console.log(box.length);//2</script>prototype是原型對象,其下有兩個方法:apply()和call()。這兩個方法的用途都在特定的作用域中調用函數,實際上等于設置函數體內this對象的值。<script type="text/javascript"> var name = "person"; function sayName1(age,addr) { console.log(name+":"+age+":"+addr); } sayName1(26,"耒陽");//person:26:耒陽 var box={ name:"lisong", sayName2:function(age,addr){ sayName1.apply(this,[age,addr]); } } box.sayName2(26,"耒陽");//person:26:耒陽 function sayName3(age,addr) { console.log(this.name+":"+age+":"+addr);//this } sayName3(26,"耒陽");//person:26:耒陽 var box={ name:"lisong", sayName4:function(age,addr){ sayName3.apply(this,[age,addr]); } } box.sayName4(26,"耒陽");//lisong:26:耒陽 var box={ name:"lisong", sayName5:function(age,addr){ sayName3.call(this,age,addr);//call與apply唯一的不同即傳遞參數的方式不同,apply傳遞的是數組 } } box.sayName5(26,"耒陽");//lisong:26:耒陽</script>
新聞熱點
疑難解答