javascript函數(shù)的四種調(diào)用模式
1、介紹
先介紹一下函數(shù)的調(diào)用模式有哪四種:
- 函數(shù)調(diào)用模式,
- 方法調(diào)用模式,
- 構(gòu)造函數(shù)調(diào)用模式,
- 上下文調(diào)用模式;
在這里對(duì)于函數(shù)的調(diào)用模式,主要介紹每種調(diào)用模式的this的指向和返回值。
2、代碼分析
①、函數(shù)調(diào)用模式
下面的調(diào)用模式就是大家最熟悉的函數(shù)調(diào)用模式,而函數(shù)調(diào)用模式的this指向和返回值是什么呢?
function fn1 () { console.log(this); }; fn1(); // 在調(diào)用函數(shù)fn1時(shí),輸出的this的結(jié)果是Window
在上述代碼中,fn1也就是函數(shù)調(diào)用模式中的this是指向Window的,而返回值是由return決定。
可以得出以下結(jié)論(函數(shù)調(diào)用模式中):
a, this是指向Window的
b, 返回值是由return語(yǔ)句決定的,如果沒(méi)有return則表示沒(méi)有返回值
②、方法調(diào)用模式
var name = "james"; var obj = { name : "wade", fn1 : function () { console.log(this.name); } }; obj.fn1(); // 在調(diào)用obj中的fn1方法函數(shù)時(shí),輸出的是wade
通過(guò)上面的代碼結(jié)果分析,會(huì)得到以下結(jié)論(方法調(diào)用模式中):
a, this 是指向調(diào)用該方法的對(duì)象
b, 返回值還是由return語(yǔ)句決定,如果沒(méi)有return表示沒(méi)有返回值
③、構(gòu)造函數(shù)調(diào)用模式
function Fn () { this.name = "james", this.age = 32, console.log(this) }; var fn1 = new Fn(); // 在調(diào)用這段代碼的時(shí)候,輸出的是Fn {name: "james", age: 32}
通過(guò)上面的代碼結(jié)果分析,會(huì)得到以下結(jié)論(構(gòu)造函數(shù)調(diào)用模式中):
a, this是指向構(gòu)造函數(shù)的實(shí)例
b, 如果沒(méi)有添加返回值的話,默認(rèn)的返回值是this
但是如果手動(dòng)添加返回值之后呢
function Fn1 () { this.name = "james"; return "wade" }; var fn1 = new Fn1(); console.log(fn1.name); // 這段代碼輸出的是 james; function Fn2 () { this.name = "james"; return [1,2,3]; }; var fn2 = new Fn2(); console.log(fn2.name); // 而這段代碼輸出的是undefined
而通過(guò)上面的代碼結(jié)果分析,優(yōu)化上面的結(jié)論:
a, this是指向構(gòu)造函數(shù)的實(shí)例
b, 如果沒(méi)有添加返回值的話,默認(rèn)的返回值是this
c, 如果有返回值,且返回值是簡(jiǎn)單數(shù)據(jù)類型(Number,String,Boolean··)的話,最后仍回返回this
d, 如果有返回值,且返回值是復(fù)雜數(shù)據(jù)類型(對(duì)象)的話,最終返回該對(duì)象,所以上面的fn2是指向數(shù)組,所以fn2.name為undefined
④、上下文調(diào)用模式
function f1(){ console.log(this); } f1.call(null); // Window f1.call(undefined); // Window f1.call(123); // Number的實(shí)例 f1.call("abc"); // String的實(shí)例 f1.call(true); // Boolean的實(shí)例 f1.call([1,2,3]); // Array的實(shí)例
通過(guò)上面的代碼結(jié)果分析,得出以下結(jié)論(上下文調(diào)用模式中):
a, 傳遞的參數(shù)不同,this的指向不同,this會(huì)指向傳入?yún)?shù)的數(shù)據(jù)類型
b, 返回值是由return決定,如果沒(méi)有return表示沒(méi)有返回值。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
JavaScript提高網(wǎng)站性能優(yōu)化的建議(二)
這篇文章主要介紹了JavaScript提高網(wǎng)站性能優(yōu)化的建議(二)的相關(guān)資料,需要的朋友可以參考下2016-07-07JavaScript實(shí)現(xiàn)的文本框placeholder提示文字功能示例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的文本框placeholder提示文字功能,涉及javascript事件響應(yīng)及頁(yè)面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-07-07淺談JavaScript的innerWidth與innerHeight
下面小編就為大家?guī)?lái)一篇淺談JavaScript的innerWidth與innerHeight。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10基于JavaScript怎么實(shí)現(xiàn)讓歌詞滾動(dòng)播放
各種音樂(lè)播放器上都有一個(gè)自動(dòng)滾動(dòng)播放歌詞的功能,當(dāng)前滾動(dòng)到的歌詞會(huì)高亮居中顯示,即使歌詞被換行也能正常居中,那么這個(gè)功能基于JavaScript怎么實(shí)現(xiàn)讓歌詞滾動(dòng)播放呢?感興趣的朋友一起看看吧2015-11-11Add Formatted Text to a Word Document
Add Formatted Text to a Word Document...2007-06-06JavaScript中Set和Map數(shù)據(jù)結(jié)構(gòu)使用場(chǎng)景詳解
這篇文章主要為大家介紹了JavaScript中Set和Map數(shù)據(jù)結(jié)構(gòu)使用場(chǎng)景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Html中JS腳本執(zhí)行順序簡(jiǎn)單舉例說(shuō)明
寫在最前面的最先執(zhí)行,Body的onload事件要在頁(yè)面加載完后才執(zhí)行。2010-06-06next.js?getServerSideProps源碼解析
這篇文章主要為大家介紹了next.js?getServerSideProps源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Javascript 數(shù)組添加 shuffle 方法的實(shí)現(xiàn)代碼
PHP 里面有個(gè)非常方便的打亂數(shù)組的函數(shù) shuffle() ,這個(gè)功能在許多情況下都會(huì)用到,但 javascript 的數(shù)組卻沒(méi)有這個(gè)方法,沒(méi)有不要緊,可以擴(kuò)展一個(gè),自己動(dòng)手,豐衣足食嘛。2009-09-09