成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深究JavaScript——函數(shù)調(diào)用與this詳解

PiscesYE / 1676人閱讀

摘要:構(gòu)造器的目的是要?jiǎng)?chuàng)建一個(gè)新對(duì)象并對(duì)其進(jìn)行設(shè)置,然后將其作為構(gòu)造器的返回值進(jìn)行返回,是通過(guò)函數(shù)調(diào)用初始化創(chuàng)建新對(duì)象?;蚍椒ㄟM(jìn)行調(diào)用通過(guò)或調(diào)用函數(shù),被調(diào)用的函數(shù)的指向第一個(gè)參數(shù)指向的。

this

??JavaScript的this總是指向一個(gè)對(duì)象,而這個(gè)對(duì)象是基于函數(shù)運(yùn)行時(shí)動(dòng)態(tài)綁定的,并非函數(shù)聲明時(shí)綁定。

函數(shù)調(diào)用方式

作為對(duì)象的方法調(diào)用

作為普通函數(shù)進(jìn)行調(diào)用

作為構(gòu)造器進(jìn)行調(diào)用

通過(guò)apply()或call()方法進(jìn)行調(diào)用

函數(shù)參數(shù)

??所有函數(shù)調(diào)用都會(huì)傳遞兩個(gè)隱式參數(shù):arguments和this。
??所謂隱式,也就意味著這些參數(shù)不會(huì)顯示列在函數(shù)簽名里,但是它們默默地傳遞給函數(shù)并存在于函數(shù)作用域內(nèi)。在函數(shù)內(nèi)部,它們可以像其他顯式命名的參數(shù)一樣使用。

arguments參數(shù)

??arguments參數(shù)是傳遞給函數(shù)的所有參數(shù)的一個(gè)集合。該集合有一個(gè)length屬性,其值是全部參數(shù)的個(gè)數(shù),單個(gè)參數(shù)值可以像訪問(wèn)數(shù)組索引一樣進(jìn)行獲取。
??但要避免將arguments參數(shù)作為數(shù)組進(jìn)行調(diào)用??梢岳肁rray.prototype.slice.call(arguments, 0)將arguments參數(shù)轉(zhuǎn)換為數(shù)組;

this參數(shù)

??this參數(shù)引用了與該函數(shù)調(diào)用進(jìn)行隱式關(guān)聯(lián)的一個(gè)對(duì)象,被稱之為函數(shù)上下文。

this指向 作為對(duì)象方法進(jìn)行調(diào)用

??當(dāng)函數(shù)作為對(duì)象的方法被調(diào)用時(shí),this指向該對(duì)象。該對(duì)象就成了函數(shù)上下文。

window.name = "global";

var obj = {
    name: "staven",
    getName: function () {
        return this.name;
    }
};
//作為對(duì)象方法調(diào)用
console.log(obj.getName());   //staven
作為普通函數(shù)進(jìn)行調(diào)用

??一種方式調(diào)用,函數(shù)的上下文時(shí)全局上下文——window對(duì)象。

window.name = "global";

var obj = {
    name: "staven",
    getName: function () {
        return this.name;
    }
};
//作為對(duì)象方法調(diào)用
console.log(obj.getName());   //staven
//將函數(shù)引用指針賦給getName變量
var getName = obj.getName;
//作為普通函數(shù)調(diào)用
console.log(getName());   //global

??常見的一種情形是,函數(shù)中的某個(gè)函數(shù)內(nèi)部的this指向的是全局對(duì)象。解決這種問(wèn)題,可var that = this;內(nèi)部函數(shù)使用that代替this。

作為構(gòu)造器進(jìn)行調(diào)用

??將函數(shù)作為構(gòu)造器進(jìn)行調(diào)用,我們要在函數(shù)調(diào)用前使用new關(guān)鍵字。其上下文是新創(chuàng)建的對(duì)象實(shí)例。
??構(gòu)造器調(diào)用時(shí),如下特殊行為會(huì)發(fā)生:

創(chuàng)建一個(gè)新的空對(duì)象

傳遞給構(gòu)造器的對(duì)象是this參數(shù),從而成為構(gòu)造器的函數(shù)上下文。

如果沒(méi)有顯式的返回值,新創(chuàng)建的對(duì)象則作為構(gòu)造器的返回值進(jìn)行返回。

??構(gòu)造器的目的是要?jiǎng)?chuàng)建一個(gè)新對(duì)象并對(duì)其進(jìn)行設(shè)置,然后將其作為構(gòu)造器的返回值進(jìn)行返回,是通過(guò)函數(shù)調(diào)用初始化創(chuàng)建新對(duì)象。

var Person = function () {
    this.name = "staven";
};

var obj = new Person();
console.log(obj.name);  //staven

??如果構(gòu)造器顯式返回了一個(gè)對(duì)象,那么此次運(yùn)算最終返回這個(gè)對(duì)象,而不是this。

var Person = function () {
    this.name = "staven";
    return {
        name: "backedName"
    }
};

var obj = new Person();
console.log(obj.name);  //backedName

??如果構(gòu)造器不顯式返回任何數(shù)據(jù),或返回的非對(duì)象數(shù)據(jù),就不會(huì)存在上述問(wèn)題。

var Person = function () {
    this.name = "staven";
    return "backedName";
};

var obj = new Person();
console.log(obj.name);  //staven
apply()或call()方法進(jìn)行調(diào)用

??通過(guò)call或apply調(diào)用函數(shù),被調(diào)用的函數(shù)的this指向第一個(gè)參數(shù)指向的this。上下文可設(shè)為任意值。每個(gè)函數(shù)都有apply()和call()方法,使用其中一個(gè)方法,都可以顯示指定任何一個(gè)對(duì)象作為其函數(shù)上下文。
??通過(guò)函數(shù)的apply()方法來(lái)調(diào)用函數(shù),我們要給apply()傳入兩個(gè)參數(shù):一個(gè)是作為函數(shù)上下文的對(duì)象,另外一個(gè)是作為函數(shù)參數(shù)所組成的數(shù)組。call()方法的使用方式類似,唯一不同的是,給函數(shù)傳入的參數(shù)是一個(gè)參數(shù)列表,而不是單個(gè)數(shù)組。
??當(dāng)使用 call 或者 apply 的時(shí)候,如果我們傳入的第一個(gè)參數(shù)為null,函數(shù)體內(nèi)的 this 會(huì)指向默認(rèn)的宿主對(duì)象。

var obj1 = {
    name: "jsor",
    getName: function () {
        return this.name;
    }
};

var obj2 = {
    name: "staven"
};

console.log(obj1.getName());        //jsor
console.log(obj1.getName.call(obj2));   //staven

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86695.html

相關(guān)文章

  • 深究JavaScript——執(zhí)行上下文

    摘要:一系列活動(dòng)的執(zhí)行上下文從邏輯上形成一個(gè)棧。堆棧中的上下文就會(huì)被依次執(zhí)行并且彈出堆棧,直到回到全局的上下文。確定上下文中的指向?qū)ο蟠_定指向或當(dāng)前對(duì)象。 定義 執(zhí)行上下文(也稱執(zhí)行環(huán)境execution context)(簡(jiǎn)稱:EC)是個(gè)抽象的概念,是在函數(shù)被調(diào)用時(shí),但是在函數(shù)體被真正執(zhí)行以前所創(chuàng)建的。每個(gè)執(zhí)行上下文都有一個(gè)變量對(duì)象(variable object),保存著當(dāng)前環(huán)境中所有的...

    netScorpion 評(píng)論0 收藏0
  • 深究JavaScript——閉包

    摘要:函數(shù)是中唯一擁有自身作用域的結(jié)構(gòu),因此閉包的創(chuàng)建依賴于函數(shù)。閉包中的匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其對(duì)象通常指向在通過(guò)或改變函數(shù)執(zhí)行環(huán)境的情況下,就會(huì)指向其他對(duì)象。當(dāng)匿名函數(shù)執(zhí)行完畢,其作用域鏈立即銷毀,從而可以減少閉包占用資源問(wèn)題。 概念 ??閉包是指能夠引用外部函數(shù)中的局部變量的函數(shù),并導(dǎo)致外部函數(shù)調(diào)用后函數(shù)對(duì)象與局部變量無(wú)法及時(shí)銷毀。函數(shù)是JavaScript中唯一擁有自身作...

    Dionysus_go 評(píng)論0 收藏0
  • 深究JavaScript——原型:prototype、constructor、__proto__

    摘要:是構(gòu)造函數(shù)的屬性,而不是實(shí)例對(duì)象的屬性,指向原型對(duì)象。這個(gè)連接存在于實(shí)例與構(gòu)造函數(shù)的原型對(duì)象而不是構(gòu)造函數(shù)之間,也就是說(shuō)實(shí)例對(duì)象與構(gòu)造函數(shù)沒(méi)有直接關(guān)系。 prototype、constructor、__proto__ ??prototype是站在構(gòu)造函數(shù)的角度討論原型對(duì)象的,用來(lái)實(shí)現(xiàn)基于原型的繼承與屬性的共享。__proto__是站在實(shí)例對(duì)象的角度討論原型對(duì)象,構(gòu)成原型鏈,同樣用于實(shí)現(xiàn)...

    jeffrey_up 評(píng)論0 收藏0
  • 深究JavaScript——參數(shù)傳遞變量復(fù)制

    摘要:在操作對(duì)象時(shí),實(shí)際上是在操作對(duì)象的引用而不是實(shí)際的對(duì)象。任一變量值操作互不影響。訪問(wèn)變量有按值和按引用兩種方式,而參數(shù)只能按值傳遞?;绢愋蛥?shù)傳遞傳給函數(shù)的是數(shù)值的一個(gè)復(fù)制,函數(shù)中對(duì)其的修改外部不可見。 ?? ECMAScript 變量可能包含兩種不同數(shù)據(jù)類型的值:基本類型值和引用類型值。 基本類型值指的是簡(jiǎn)單的數(shù)據(jù)段,而引用類型值指那些可能由多個(gè)值構(gòu)成的對(duì)象。 ??5 種基本數(shù)據(jù)類...

    jzman 評(píng)論0 收藏0
  • JavaScript深入淺出

    摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對(duì)方法,包括,,。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸?,因此文中只看懂?8 成左右,希望能夠給大家?guī)?lái)幫助....(據(jù)說(shuō)是阿里的前端妹子寫的) this 的值到底...

    blair 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

PiscesYE

|高級(jí)講師

TA的文章

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