Javascript中定義函數(shù)的方式有多種,函數(shù)直接量就是其中一種。
如var fun = function(){},這里function如果不賦值給fun那么它就是一個(gè)匿名函數(shù)。好,看看匿名函數(shù)的如何被調(diào)用。
方式1,調(diào)用函數(shù),得到返回值。強(qiáng)制運(yùn)算符使函數(shù)調(diào)用執(zhí)行(function(x,y){ alert(x+y); return x+y; }(3,4)); 方式2,調(diào)用函數(shù),得到返回值。
強(qiáng)制函數(shù)直接量執(zhí)行再返回一個(gè)引用,引用再去調(diào)用執(zhí)行(function(x,y){ alert(x+y); return x+y;} )(3,4); 這種方式也是很多庫愛用的調(diào)用方式,如jQuery,Mootools。 方式3,使用voidvoid function(x) { x = x-1; alert(x);}(9);。
/*第一種方法,使用function語句,格式如下*/function fn(){ alert("這是使用function語句進(jìn)行函數(shù)定義"); }fn();/*第二種方法,使用Function()構(gòu)造函數(shù)克隆函數(shù)*/var F = new Function("a","b","alert(a+b)"); F(a,b);其實(shí)相當(dāng)于如下代碼:function F(a,b){ alert(a+b); }/*第三種方法,使用函數(shù)直接量*/var zhenn = function(){ alert("zhenn"); } zhenn();。
定義函數(shù)的種方法1.
最基本的作為一個(gè)本本分分的函數(shù)聲明使用。
復(fù)制代碼代碼如下:function func(){}或var func=function(){};2.
作為一個(gè)類構(gòu)造器使用:復(fù)制代碼代碼如下:function class(){}
class.prototype={};
var item=new class();3.
作為閉包使用:復(fù)制代碼代碼如下:(function(){
//獨(dú)立作用域})();4.
可以作為選擇器使用:復(fù)制代碼代碼如下:var addEvent=new function(){
if(!-[1,]) return function(elem,type,func){attachEvent(elem,'on'+type,func);};
else return function(elem,type,func){addEventListener(elem,type,func,false);}
};//避免了重復(fù)判斷5.
JS函數(shù)的定義方式比較靈活,它不同于其他的語言,每個(gè)函數(shù)都是作為一個(gè)對象被維護(hù)和運(yùn)行的。
先看幾種常用的定義方式:
function func1([參數(shù)]){
/*函數(shù)體*/
}
var func2=function([參數(shù)]){
/*函數(shù)體*/
};
var func3=function func4([參數(shù)]){
/*函數(shù)體*/
};
var func5=new Function();
上述第一種方式是最常用的方式,不用多說。
第二種是將一匿名函數(shù)賦給一個(gè)變量,調(diào)用方法:func2([函數(shù)]);
第三種是將func4賦給變量func3,調(diào)用方法:func3([函數(shù)]);或func4([函數(shù)]);
第四種是聲明func5為一個(gè)對象。
再看看它們的區(qū)別:
function func(){
//函數(shù)體
}
//等價(jià)于
var func=function(){
//函數(shù)體
}
但同樣是定義函數(shù),在用法上有一定的區(qū)別。
<script>
//這樣是正確的
func(1);
function func(a)
{
alert(a);
}
</script>
<script>
//這樣是錯(cuò)誤的,會(huì)提示func未定義,主要是在調(diào)用func之前沒有定義
func(1);
var func = function(a)
{
alert(a);
}
//這樣是正確的,在調(diào)用func之前有定義
var func = function(a)
{
alert(a);
}
func(1);
</script>
用同樣的方法可以去理解第三種定義方式。
第四種定義方式也是需要聲明對象后才可以引用。
當(dāng)一個(gè)函數(shù)被保存為對象的一個(gè)屬性時(shí),我們稱它為一個(gè)方法。當(dāng)一個(gè)對象的方法被調(diào)用時(shí),this被綁定到調(diào)用方法的對象。
var myObj = { name : "MT", setName : function(name){ this.name = name; }}; myObj.setName("哀木涕");console.log(myObj.name); //"哀木涕" myObj.setName("小德");console.log(myObj.name); //小德
方法可以使用this訪問自己所屬的對象,所以它能從對象中取值或?qū)ο筮M(jìn)行修改。this和對象的綁定發(fā)生在方法調(diào)用的時(shí)候。這個(gè)“超級(jí)”延遲綁定(vary late binding)使得函數(shù)可以對this高度復(fù)用。通過this可以取得它們所屬對象的上下文方法稱為公共方法(public method)。
1. 函數(shù)調(diào)用
function test(){
alert(1);
}
2. 直接調(diào)用
test();
3. 指定內(nèi)部this指針調(diào)用
(1)test.call(window);//執(zhí)行test函數(shù),將方法內(nèi)部this指向window
(2)test.apply(window);///執(zhí)行test函數(shù),將方法內(nèi)部this指向window
4. 通過事件調(diào)用
window.onload = test;//當(dāng)頁面載入時(shí)調(diào)用
window.onerror = test;當(dāng)頁面發(fā)生錯(cuò)誤時(shí)調(diào)用
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號(hào)-4 Copyright ? 2016 學(xué)習(xí)鳥. 頁面生成時(shí)間:2.843秒