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