javascript
javascript函数调用的各种方法!!
在JavaScript中一共有下面4種調(diào)用方式:
(1)?基本函數(shù)調(diào)用
(2)方法調(diào)用
(3)構(gòu)造器調(diào)用
(4)通過(guò)call()和apply()進(jìn)行調(diào)用
1.?基本函數(shù)調(diào)用
普通函數(shù)調(diào)用模式,如:
| 1 2 3 4 | ??function?fn(o){ ?????……? ??} ??fn({x:1}); |
在基本函數(shù)調(diào)用中,
(1)每個(gè)參數(shù)作為實(shí)參傳遞給聲明函數(shù)時(shí)定義的形參;
(2)this被綁定到全局變量(直接調(diào)用一般指的是window)
| 1 2 3 4 5 6 7 8 9 10 | ??var?object?=?{value:1}; ??var?value?=?2; ?object.printProps?=?function(){ ????var?printValue?=?function(){ ??????console.log(this.value); ????}; ???printValue(); ???console.log(this.value); ?} ?object.printProps(); |
此時(shí)的運(yùn)行結(jié)果是:
?2
?1
在printValue()函數(shù)在執(zhí)行時(shí),this.value值為2,也就是說(shuō),this指向的是全局對(duì)象,而不是對(duì)象object。
(3)返回值:函數(shù)的返回值成為調(diào)用表達(dá)式的值。
I.?如果函數(shù)返回是解釋器到達(dá)結(jié)尾,也就是沒(méi)有執(zhí)行到return?XXX的語(yǔ)句。返回值為undefined。?
II.?如果函數(shù)返回是因?yàn)榻邮芷鲌?zhí)行到return?xxx語(yǔ)句,?返回return之后的值。?
III.?如果return語(yǔ)句后沒(méi)有值,即return,則返回undefined。
2.?方法調(diào)用
當(dāng)一個(gè)函數(shù)被保存為對(duì)象的一個(gè)屬性時(shí),稱(chēng)為方法。
(1)參數(shù)和返回值的處理與函數(shù)調(diào)用一致;
(2)調(diào)用上下文this為該對(duì)象
| 1 2 3 4 5 6 7 8 9 10 11 | ?? function?print(){ ????console.log(this.value);? ??} ??var?value=1; ??var?object?=?{value:2}; ??object.m?=?print; ??//作為函數(shù)調(diào)用 ??print(); ??//作為方法調(diào)用 ??object.m(); |
運(yùn)行結(jié)果為:
?1
?2
當(dāng)調(diào)用print時(shí),this綁定的是全局對(duì)象,打印全局變量value值1。
但是當(dāng)調(diào)用object.m()時(shí),this綁定的是方法m所屬的對(duì)象Object,所以打印的值為Object.value,即2。
3.?構(gòu)造器調(diào)用
?函數(shù)或方法調(diào)用之前帶有關(guān)鍵字new,它就構(gòu)成構(gòu)造函數(shù)調(diào)用。如:
| 1 2 | ?function?fn(){……} ?var?obj?=?new?fn(); |
(1)參數(shù)處理:一般情況構(gòu)造器參數(shù)處理和函數(shù)調(diào)用模式一致。但如果構(gòu)造函數(shù)沒(méi)用形參,JavaScript構(gòu)造函數(shù)調(diào)用語(yǔ)法是允許省略實(shí)參列表和圓括號(hào)的。
如:下面兩行代碼是等價(jià)的。
| 1 2 | ??var?obj?=?new?Object(); ??var?obj?=?new?Object; |
(2)函數(shù)的調(diào)用上下文為新創(chuàng)建的對(duì)象。
| 1 2 3 4 5 6 7 8 9 10 | ?function?fn(value){ ???this.value?=value; ?} ?var?value?=1; ?var?obj?=?new?fn(2); ?console.log(value); ?console.log(obj.value); ?fn(3); ?console.log(value); ?console.log(obj.value); |
運(yùn)行結(jié)果:
?1
?2
?3
?2
?I.?第一次調(diào)用fn()函數(shù)是作為構(gòu)造函數(shù)調(diào)用的,此時(shí)調(diào)用上下文this被綁定到新創(chuàng)建的對(duì)象obj。所以全局變量value值不變,obj新增一個(gè)屬性value,值為2;
?II.?第二次調(diào)用fn()函數(shù)是作為普通函數(shù)調(diào)用的,此時(shí)調(diào)用上下為this被綁定到全局對(duì)象,在瀏覽器中為window。所以全局對(duì)象的value值改變?yōu)?,而obj的屬性值不變。
(3)構(gòu)造函數(shù)通常不使用return關(guān)鍵字,返回值為新對(duì)象。而如果構(gòu)造函數(shù)顯示地使用return語(yǔ)句返回一個(gè)對(duì)象,那么調(diào)用表達(dá)式值就為這個(gè)對(duì)象。如果構(gòu)造函數(shù)使用return語(yǔ)句但沒(méi)有指定返回值或者返回一個(gè)原始值,則忽略返回值,同時(shí)使用新對(duì)象作為調(diào)用結(jié)果。
4.通過(guò)call()和apply()進(jìn)行調(diào)用
雖然在一個(gè)獨(dú)立的函數(shù)調(diào)用中,根據(jù)是否是strict模式,this指向undefined或window,不過(guò),我們還是可以控制this的指向的!要指定函數(shù)的this指向哪個(gè)對(duì)象,可以用函數(shù)本身的apply()或call()方法,它們都是接收兩個(gè)參數(shù)。
call()方法使用它自有的實(shí)參列表作為函數(shù)的實(shí)參,apply()方法要求以數(shù)組的形式傳入?yún)?shù)
apply方法第一個(gè)參數(shù)是改變后的調(diào)用對(duì)象,第二個(gè)參數(shù)是將函數(shù)參數(shù)以數(shù)組形式傳入[?],而call()第一個(gè)參數(shù)與call()方法相同,第二個(gè)參數(shù)是原來(lái)參數(shù)序列......。
轉(zhuǎn)載于:https://www.cnblogs.com/msidevs/p/6058232.html
總結(jié)
以上是生活随笔為你收集整理的javascript函数调用的各种方法!!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: gitlab在centons环境下的安装
- 下一篇: mysql分表规则(转)