国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

深入理解函數(shù)--arguments和this關(guān)鍵字

lemon / 1933人閱讀

摘要:有些在頁面未加載完成時(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

相關(guān)文章

  • 深入理解ES6之《函數(shù)

    摘要:默認(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) { ...

    Seay 評論0 收藏0
  • 深入理解ES6之《函數(shù)

    摘要:默認(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) { ...

    cyixlq 評論0 收藏0
  • 深入理解JavaScript系列12:變量對象

    摘要:所有變量聲明由名稱和對應(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-...

    vincent_xyb 評論0 收藏0
  • 形象化模擬作用域鏈,深入理解js作用域、閉包

    摘要:至此作用域鏈創(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)境 作用域 作用域鏈 變...

    txgcwm 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<