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