javascript
深入理解javascript函数
函數(shù)實際上是對象,每個函數(shù)都是Function類型的實例,且與其他類型一樣具有屬性和方法.由于函數(shù)是對象,故函數(shù)名即為指向函數(shù)的指針,正是由于這一點,函數(shù)沒有重載,重復(fù)定義函數(shù)只會后者替換前者.
函數(shù)的定義
函數(shù)的定義有三種:
函數(shù)聲明
函數(shù)表達(dá)式
使用Function構(gòu)造函數(shù)(不推薦使用)
注:函數(shù)聲明和函數(shù)表達(dá)式的唯一區(qū)別是函數(shù)聲明會提前.意即函數(shù)調(diào)用在函數(shù)聲明之前可以正常運行.
作為值的函數(shù)
前面提到函數(shù)是對象,所以函數(shù)也可以作為參數(shù)值或返回值.
//作為參數(shù) function callSomeFunction(someFunction,someArgument){ reuturn someFunction(someArgument); }function add10(num){ return num+10; }var result=callSomeFunction(add10,10); alert(result); //20//作為返回值 function createCompareFunction(propertyName){return function(object1,object2){var value1 = object1[propertyName];var value2 = object2[propertyName];if(value1 < value2){return -1;}else if(value1 > value2){return 1;}else{return 0;}} }函數(shù)內(nèi)部屬性
在函數(shù)內(nèi)部有兩個特殊對象:arguments this
arguments是一個類數(shù)組對象,包含傳入函數(shù)中的所有參數(shù)(這是其主要用途),除此之外,其還有一個callee的屬性,該屬性是一個指針,指向當(dāng)前函數(shù)對象.
this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對象.在調(diào)用函數(shù)之前,this的值是不確定的,當(dāng)在全局對象中調(diào)用函數(shù)時,this引用的是全局對象window,當(dāng)把函數(shù)賦值給某對象時,this指的是此對象.
函數(shù)的屬性和方法
屬性
length:函數(shù)希望接收的命名參數(shù)的個數(shù).
prototype:這是一個非常耐人尋味的屬性,它保存著函數(shù)的實例方法,意即到通過函數(shù)實例化得到的對象可以訪問prototype中的方法.此屬性在自定義引用類型和實現(xiàn)繼承很有用處.
方法
apply call這兩個方法是函數(shù)的非繼承方法.用途都是設(shè)置函數(shù)體內(nèi)this對象的值.
apply接收兩個參數(shù),第一個是運行函數(shù)的作用域,通俗的說就是將這個參數(shù)作為this指向的值.第二個參數(shù)是數(shù)組作為執(zhí)行函數(shù)的參數(shù).
function sum(num1,num2){ return num1+num2; } function callSum(num1,num2){ return sum.apply(this,arguments); } alert(callSum(10,10)); //20call接收的第一個參數(shù)也是運行函數(shù)的作用域,后面的參數(shù)也是傳遞給執(zhí)行函數(shù)的參數(shù),與apply不同的是,后面的參數(shù)并非數(shù)組,而是逐個列舉出來的.
function sum(sum1,sum2){ return sum1+sum2; } function callSum(num1,num2){ return sum.call(this,num1,num2); } alert(callSum(10,10)); //20構(gòu)造函數(shù)
ECMAScript中的構(gòu)造函數(shù)可以創(chuàng)建特定類型的對象.內(nèi)置的構(gòu)造函數(shù)(例如Array Object)會自動出現(xiàn)在執(zhí)行環(huán)境中.構(gòu)造函數(shù)的首字母應(yīng)該以大寫字母開頭,從而區(qū)分非構(gòu)造函數(shù).
要創(chuàng)建新的實例,必須使用new操作符,穿件新的實例會經(jīng)歷以下四個步驟:
創(chuàng)建一個新對象
將構(gòu)造函數(shù)的作用域賦值給新對象(因此this指向這個新對象);
指向構(gòu)造函數(shù)中的代碼.
返回新對象
構(gòu)造函數(shù)與普通函數(shù)的區(qū)別在于構(gòu)造函數(shù)在實例化時加了new關(guān)鍵字.其它地方完全一樣.
重要提示 在通過構(gòu)造函數(shù)實例化對象時,請勿把方法放在構(gòu)造函數(shù)中,因為每個函數(shù)(在這里指方法方法)都是對象,每次實例化一個對象時這個對象中會保存每一構(gòu)造函數(shù)中的方法,這是很影響性能的.解決辦法是把這些方法放在prototype屬性中.
總結(jié)
以上是生活随笔為你收集整理的深入理解javascript函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无法打开物理文件“E:\Database
- 下一篇: gradle idea java ssm