摘要:有些在頁面未加載完成時(shí)執(zhí)行的函數(shù)可能會(huì)找不到對象對象未加載完成,會(huì)出現(xiàn)錯(cuò)誤。以上文章中,如有錯(cuò)誤,請及時(shí)指正謝謝著
寫在前面:
上一章講解了深入函數(shù),但是遺漏了一個(gè)很重要的arguments,我覺得有必要講解一下,因?yàn)樵诤芏鄷r(shí)候我們在項(xiàng)目中很多地方都用到arguments,所以我們來深入了解一下。
arguments屬性:在函數(shù)對象中有一個(gè)屬性叫arguments屬性,通過這個(gè)屬性可以獲取到相應(yīng)的參數(shù)值,這個(gè)屬性是以數(shù)組形式保存參數(shù)(偽數(shù)組),其實(shí)就是傳遞的參數(shù)。
function sum (num){ alert(arguments.length); //3 alert(num); //16 } sum(1,2,3);
我們雖然傳遞了三個(gè)參數(shù),上一章我們講過了雖然它只會(huì)返回 “1”,但是傳遞的參數(shù)確實(shí)還是存在的。我們可以通過arguments.length可以看到它其實(shí)有三個(gè)參數(shù),但是接受到的只有一個(gè)參數(shù)而已。
我們想得到這三個(gè)參數(shù)也很簡單,寫一個(gè)for循環(huán)就可以了:
for(var i=0;i一個(gè)簡單的遞歸:arguments.callee()方法 在arguments中有一個(gè)方法:callee(參數(shù)),我們可以利用這個(gè)方法去反向的調(diào)用。
一個(gè)簡單的遞歸(階層):
function sum (num){ if (num <= 1) return 1; else return num * sum(num-1); } alert(sum(4)); //返回結(jié)果:24以上調(diào)用遞歸的函數(shù)名稱和原有的函數(shù)名稱耦合在一起了,也就是說以后如果我們改了函數(shù)名稱,函數(shù)體內(nèi)的的遞歸就失效了,我們能想到的辦法就是更改函數(shù)體內(nèi)的調(diào)用函數(shù),但是這往往不是我們想要的,我們想要的就是可以動(dòng)態(tài)的調(diào)用,因?yàn)橥覀儗懗鰜淼暮瘮?shù),是不希望更改封裝好在函數(shù)體內(nèi)的參數(shù)或者值的。
function sum (num){ if (num <= 1) return 1; else return num * arguments.callee(num-1); } alert(sum(4)); //返回結(jié)果:24我們再來看一個(gè)使用arguments.callee()的好處:
function sum (num){ if (num <= 1) return 1; else return num * sum(num-1); } var sum1 = sum; //將sum賦值給sum1變量存儲(chǔ) alert(sum1(4)); //返回結(jié)果:24 sum = null; //讓sum 指向?yàn)閚ull alert(sum1(4)); //sum1 is not a function !我們發(fā)現(xiàn),當(dāng)sum指向null的時(shí)候,下面的alert就報(bào)錯(cuò)了,而我們不希望這種情況的發(fā)生,我們可以使用這個(gè)方法來去反向調(diào)用。
function sum (num){ if (num <= 1) return 1; else return num * arguments.callee(num-1); } var sum1 = sum; alert(sum1(4)); //返回結(jié)果:24 sum = null; //讓sum 指向?yàn)閚ull alert(sum1(4)); //返回結(jié)果:24老生常談 : this關(guān)鍵字當(dāng)我們需要?jiǎng)?chuàng)建一個(gè)類的時(shí)候,設(shè)置類的屬性和方法需要通過this關(guān)鍵字來引用,this關(guān)鍵字在調(diào)用時(shí)候會(huì)根據(jù)不同的調(diào)用對象指向的也是不同的。
var color = "red"; function showColor() { alert(this.color); } //創(chuàng)建類 function Circle (color) { this.color = color; this.showColor = showColor; } var box = new Circle("yellow"); box.showColor(); //返回結(jié)果:yellow我們使用box來實(shí)例化Circle,此時(shí)this指向的是box,所以color就是yellow.
box.showColor(); //yellow showColor(); //red此時(shí)調(diào)用的函數(shù)指向的是window,所以會(huì)返回red.
后記:調(diào)試上面代碼發(fā)現(xiàn)的問題(此處屬于個(gè)人理解,如有錯(cuò)誤請見諒并指出!)
我在寫這篇文章的時(shí)候發(fā)現(xiàn)的問題就是:
window.onload = function () { var color = "red"; function showColor () { alert(this.color); //undefined } showColor(); };如果我們寫了window.onload 它會(huì)返回undefined,window.onload的意思是頁面加載完成之后所發(fā)生的事件。有些在頁面未加載完成時(shí)執(zhí)行的函數(shù)可能會(huì)找不到對象(對象未加載完成),會(huì)出現(xiàn)錯(cuò)誤。
一個(gè)小例子來體現(xiàn)JavaScript預(yù)處理:function f (a,b) { alert(a); alert(b); var b = 100; function a () {} } f(1,2);我們來看看這個(gè)函數(shù)從解析到執(zhí)行都發(fā)生了什么:
通過上面的例子,我們來理解一下剛剛的例子:
預(yù)處理階段,JavaScript會(huì)掃描用var聲明的變量和用聲明方式創(chuàng)建的函數(shù)(并非函數(shù)表達(dá)式),其他之外都會(huì)忽略。
以上文章中,如有錯(cuò)誤,請及時(shí)指正!謝謝!
*Brian.Lee著*
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/82573.html
摘要:默認(rèn)參數(shù)中要為參數(shù)指定默認(rèn)值,只能如下所示但是這樣有一個(gè)問題如果傳進(jìn)來的值為,則也會(huì)賦值變成,所以更加完全的做法是檢測參數(shù)類型中直接可以為任意參數(shù)指定默認(rèn)值,在已指定默認(rèn)值的參數(shù)后可以繼續(xù)聲明無默認(rèn)值參數(shù)是否使用函數(shù)默認(rèn)值主要依賴于調(diào)用函數(shù) 默認(rèn)參數(shù) ES5中要為參數(shù)指定默認(rèn)值,只能如下所示: function makeRequst(url, timeout, callback) { ...
摘要:默認(rèn)參數(shù)中要為參數(shù)指定默認(rèn)值,只能如下所示但是這樣有一個(gè)問題如果傳進(jìn)來的值為,則也會(huì)賦值變成,所以更加完全的做法是檢測參數(shù)類型中直接可以為任意參數(shù)指定默認(rèn)值,在已指定默認(rèn)值的參數(shù)后可以繼續(xù)聲明無默認(rèn)值參數(shù)是否使用函數(shù)默認(rèn)值主要依賴于調(diào)用函數(shù) 默認(rèn)參數(shù) ES5中要為參數(shù)指定默認(rèn)值,只能如下所示: function makeRequst(url, timeout, callback) { ...
摘要:所有變量聲明由名稱和對應(yīng)值組成一個(gè)變量對象的屬性被創(chuàng)建如果變量名稱跟已經(jīng)聲明的形式參數(shù)或函數(shù)相同,則變量聲明不會(huì)干擾已經(jīng)存在的這類屬性。 介紹 JavaScript編程的時(shí)候總避免不了聲明函數(shù)和變量,以成功構(gòu)建我們的系統(tǒng),但是解釋器是如何并且在什么地方去查找這些函數(shù)和變量呢?我們引用這些對象的時(shí)候究竟發(fā)生了什么? 原始發(fā)布:Dmitry A. Soshnikov 發(fā)布時(shí)間:2009-...
摘要:至此作用域鏈創(chuàng)建完畢。好了,通過深入理解作用域鏈,我們能跟好的理解的運(yùn)行機(jī)制和閉包的原理。 前言 理解javascript中的作用域和作用域鏈對我們理解js這們語言。這次想深入的聊下關(guān)于js執(zhí)行的內(nèi)部機(jī)制,主要討論下,作用域,作用域鏈,閉包的概念。為了更好的理解這些東西,我模擬了當(dāng)一個(gè)函數(shù)執(zhí)行時(shí),js引擎做了哪些事情--那些我們看不見的動(dòng)作。 關(guān)鍵詞: 執(zhí)行環(huán)境 作用域 作用域鏈 變...
閱讀 2205·2021-11-25 09:43
閱讀 1172·2021-11-23 09:51
閱讀 3506·2021-11-23 09:51
閱讀 3633·2021-11-22 09:34
閱讀 1567·2021-10-09 09:43
閱讀 2129·2019-08-30 15:53
閱讀 3169·2019-08-30 14:07
閱讀 577·2019-08-28 18:14