arguments是什么?
arguments是函數(shù)調(diào)用時(shí),創(chuàng)建的一個(gè)類似的數(shù)組但又不是數(shù)組的對(duì)象,并且它存儲(chǔ)的是實(shí)際傳遞給函數(shù)的參數(shù),并不局限于函數(shù)聲明的參數(shù)列表哦。
尼瑪,什么意思?
寫個(gè)demo看看,代碼見下
<!DOCTYPE html> <head> <title>arguments</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <script> function obj(){ //利用instanceof判斷arguments console.log( 'arguments instanceof Array? ' + (arguments instanceof Array) ); console.log( 'arguments instanceof Object? ' + (arguments instanceof Object) ); console.log(arguments); } obj(); </script> </body></html>
運(yùn)行該代碼,通過(guò)chrome調(diào)試器,可得下圖
我利用instanceof判斷arguments,從打印的效果看,arguments是一個(gè)對(duì)象。
然后展開打印出的arguments,可以從上圖得知,它里面包括了許多屬性,callee也在內(nèi)。
接下來(lái),我們修改上面的代碼,在調(diào)用obj函數(shù)時(shí),給它傳遞參數(shù),但obj函數(shù)是沒有參數(shù)的。
具體代碼見下
<!DOCTYPE html> <head> <title>arguments</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <script> function obj(){ console.log( 'arguments instanceof Array? ' + (arguments instanceof Array) ); console.log( 'arguments instanceof Object? ' + (arguments instanceof Object) ); console.log(arguments); } //向obj傳遞參數(shù) obj('monkey','love',24); </script> </body></html>
通過(guò)chrome調(diào)試器,可得下圖
大家可以看見,arguments包含了三個(gè)我們給它傳遞的參數(shù)”monkey”,”love”,24。
所以說(shuō),為什么arguments是存儲(chǔ)的實(shí)際傳遞給函數(shù)的參數(shù)呢,而不是函數(shù)聲明的參數(shù)。
callee是什么?
callee是arguments對(duì)象的一個(gè)成員,它的值為“正被執(zhí)行的Function對(duì)象”。
什么意思呢?
我們寫個(gè)demo,看看輸出結(jié)果就知道啦。
代碼和結(jié)果圖見下
<!DOCTYPE html> <head> <title>callee</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <script> function obj(){ //利用callee console.log(arguments.callee); } obj(); </script> </body></html>
從上面的圖片可知,arguments.callee是指向參數(shù)arguments對(duì)象的函數(shù),在這里就是obj咯。
caller是什么?
caller是函數(shù)對(duì)象的一個(gè)屬性,該屬性保存著調(diào)用當(dāng)前函數(shù)的函數(shù)。
注意,是調(diào)用。不僅僅包含閉包哦。如果沒有父函數(shù),則為null。
還是老樣子,我們一直來(lái)寫個(gè)demo看看。
代碼如下:
<!DOCTYPE html> <head> <title>caller</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <script> //child是parent內(nèi)的函數(shù),并在parent內(nèi)執(zhí)行child function parent(){ function child(){ //這里child的父函數(shù)就是parent console.log( child.caller ); } child(); } //parent1沒有被別人調(diào)用 function parent1(){ //這里parent1沒有父函數(shù) console.log(parent1.caller); } //parent2調(diào)用了child2 function parent2(){ child2(); } function child2(){ console.log(child2.caller); } /*執(zhí)行 parent里嵌套了child函數(shù) parent1沒有嵌套函數(shù) parent2調(diào)用了child2,child2不是嵌套在parent2里的函數(shù) */ parent(); parent1(); parent2(); </script> </body></html>
打開chrome調(diào)試器,可得下效果圖
結(jié)合代碼和上圖理解,這下理解了caller了么?
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注