亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

this學(xué)習(xí)筆記

nanfeiyan / 1488人閱讀

摘要:但是有一個(gè)總的原則,那就是指的是,調(diào)用函數(shù)的那個(gè)對(duì)象作為函數(shù)調(diào)用在函數(shù)被直接調(diào)用時(shí)綁定到全局對(duì)象。這一過(guò)程分為三步創(chuàng)建類的實(shí)例。這步是把一個(gè)空的對(duì)象的屬性設(shè)置為。函數(shù)被傳入?yún)?shù)并調(diào)用,關(guān)鍵字被設(shè)定為該實(shí)例。

this 的值到底是什么?一次說(shuō)清楚
你怎么還沒(méi)搞懂 this?
this、apply、call、bind

一、What"s this?

由于運(yùn)行期綁定的特性,JavaScript 中的 this 含義非常多,它可以是全局對(duì)象、當(dāng)前對(duì)象或者任意對(duì)象,這完全取決于函數(shù)的調(diào)用方式

隨著函數(shù)使用場(chǎng)合的不同,this的值會(huì)發(fā)生變化。但是有一個(gè)總的原則,那就是this指的是,調(diào)用函數(shù)的那個(gè)對(duì)象

1、作為函數(shù)調(diào)用

在函數(shù)被直接調(diào)用時(shí)this綁定到全局對(duì)象。在瀏覽器中,window 就是該全局對(duì)象

console.log(this);    //window

function fn1(){
    console.log(this);
}
fn1();  //window
2、內(nèi)部函數(shù)

函數(shù)嵌套產(chǎn)生的內(nèi)部函數(shù)的this不是其父函數(shù),仍然是全局變量

function fn0(){
    function fn(){
        console.log(this);
    }
    fn();
}

fn0();

//window

3、setTimeout、setInterval

這兩個(gè)方法執(zhí)行的函數(shù)this也是全局對(duì)象

document.addEventListener("click", function(e){

console.log(this);    //document
setTimeout(function(){
    console.log(this);    //window
}, 200);

}, false);

4、作為構(gòu)造函數(shù)調(diào)用

所謂構(gòu)造函數(shù),就是通過(guò)這個(gè)函數(shù)生成一個(gè)新對(duì)象(object)。這時(shí),this就指這個(gè)新對(duì)象

new 運(yùn)算符接受一個(gè)函數(shù) F 及其參數(shù):new F(arguments...)。這一過(guò)程分為三步:

創(chuàng)建類的實(shí)例。這步是把一個(gè)空的對(duì)象的 proto 屬性設(shè)置為 F.prototype 。
初始化實(shí)例。函數(shù) F 被傳入?yún)?shù)并調(diào)用,關(guān)鍵字 this 被設(shè)定為該實(shí)例。
返回實(shí)例。
看例子

function Person(name){
    this.name = name;
}
Person.prototype.printName = function(){
    console.log(this.name);
};

var p1 = new Person("Byron");
var p2 = new Person("Casper");
var p3 = new Person("Vincent");

p1.printName();  //Byron
p2.printName(); //Casper
p3.printName();  //Vincent
5、作為對(duì)象方法調(diào)用

在 JavaScript 中,函數(shù)也是對(duì)象,因此函數(shù)可以作為一個(gè)對(duì)象的屬性,此時(shí)該函數(shù)被稱為該對(duì)象的方法,在使用這種調(diào)用方式時(shí),this 被自然綁定到該對(duì)象

var obj1 = {
    name: "Byron",
    fn : function(){
        console.log(this); //obj1
    }
};

obj1.fn();  

小陷阱

var fn2 = obj1.fn;

fn2();  //window

因?yàn)閒n2等于? (){console.log(this)},所以this指向的是全局變量

6、DOM對(duì)象綁定事件

在事件處理程序中this代表事件源DOM對(duì)象(低版本IE有bug,指向了window)

document.addEventListener("click", function(e){
    console.log(this);  //document
    var _document = this;  
    setTimeout(function(){
        console.log(this); //window
        console.log(_document);  //document
    }, 200);
}, false);

解決方案


輸出結(jié)果//document//document//document

7、Function.prototype.bind

bind,返回一個(gè)新函數(shù),并且使函數(shù)內(nèi)部的this為傳入的第一個(gè)參數(shù)
bind的用法是給 函數(shù)名.bind(參數(shù))返回的是一個(gè)函數(shù),加()才立即執(zhí)行

var obj1 = {
    name: "Byron",
    fn : function(){
        console.log(this);
    }
};
var fn3 = obj1.fn.bind()() //window
var fn4 = obj1.fn.bind(obj1)()   //obj1

例二
首先bind的this.sayhello沒(méi)有指向page,而是指向的this.node

解決方案一:

解決方案二,,this.sayhello,但是這個(gè)方案有問(wèn)題,在執(zhí)行sayhello函數(shù)時(shí),函數(shù)內(nèi)部的this是指向this.node(document.body),而不是指向page的

解決方案三:

解決方案二的問(wèn)題,我們用bind函數(shù)傳遞了this參數(shù),sayhello函數(shù)內(nèi)部this就還是指向page的了

8、使用call和apply設(shè)置this

call apply,調(diào)用一個(gè)函數(shù),傳入函數(shù)執(zhí)行上下文及參數(shù)

fn.call(context, param1, param2...)

fn.apply(context, paramArray)

語(yǔ)法很簡(jiǎn)單,第一個(gè)參數(shù)都是希望設(shè)置的this對(duì)象,不同之處在于call方法接收參數(shù)列表,而apply接收參數(shù)數(shù)組

fn2.call(obj1);
fn2.apply(obj1);

難得舉例了,直接看這篇文章寫(xiě)的更好this、apply、call、bind

二、函數(shù)的執(zhí)行環(huán)境和變量 1、函數(shù)的執(zhí)行環(huán)境

一個(gè)函數(shù)被執(zhí)行時(shí),會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境(ExecutionContext),函數(shù)的所有的行為均發(fā)生在此執(zhí)行環(huán)境中,構(gòu)建該執(zhí)行環(huán)境時(shí),JavaScript 首先會(huì)創(chuàng)建 arguments變量,其中包含調(diào)用函數(shù)時(shí)傳入的參數(shù)

接下來(lái)創(chuàng)建作用域鏈,然后初始化變量。首先初始化函數(shù)的形參表,值為 arguments變量中對(duì)應(yīng)的值,如果 arguments變量中沒(méi)有對(duì)應(yīng)值,則該形參初始化為 undefined。

如果該函數(shù)中含有內(nèi)部函數(shù),則初始化這些內(nèi)部函數(shù)。如果沒(méi)有,繼續(xù)初始化該函數(shù)內(nèi)定義的局部變量,需要注意的是此時(shí)這些變量初始化為 undefined,其賦值操作在執(zhí)行環(huán)境(ExecutionContext)創(chuàng)建成功后,函數(shù)執(zhí)行時(shí)才會(huì)執(zhí)行,這點(diǎn)對(duì)于我們理解JavaScript中的變量作用域非常重要,最后為this變量賦值,會(huì)根據(jù)函數(shù)調(diào)用方式的不同,賦給this全局對(duì)象,當(dāng)前對(duì)象等

至此函數(shù)的執(zhí)行環(huán)境(ExecutionContext)創(chuàng)建成功,函數(shù)開(kāi)始逐行執(zhí)行,所需變量均從之前構(gòu)建好的執(zhí)行環(huán)境(ExecutionContext)中讀取

2、三種變量(名稱有點(diǎn)不規(guī)范,暫時(shí)可以不管名稱)

實(shí)例變量:(this)類的實(shí)例才能訪問(wèn)到的變量

靜態(tài)變量:(屬性)直接類型對(duì)象能訪問(wèn)到的變量

私有變量:(局部變量)當(dāng)前作用域內(nèi)有效的變量

看個(gè)例子

function ClassA(){

var a = 1; //私有變量,只有函數(shù)內(nèi)部可以訪問(wèn).外部無(wú)法訪問(wèn),外部要訪問(wèn)的話需要返回
this.b = 2; //實(shí)例變量,只有實(shí)例可以訪問(wèn)

}

ClassA.c = 3; // 靜態(tài)變量,也就是給函數(shù)對(duì)象增加了屬性

console.log(a); // error無(wú)法訪問(wèn)局部變量
console.log(ClassA.b) // undefined this.b并不是給函數(shù)賦值的屬性,而是
console.log(ClassA.c) //3

var classa = new ClassA();
console.log(classa.a);//undefined 無(wú)法訪問(wèn)局部變量
console.log(classa.b);// 2
console.log(classa.c);//undefined ClassA.c只是函數(shù)上的c屬性和classa這個(gè)對(duì)象沒(méi)有關(guān)系

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

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

相關(guān)文章

  • React學(xué)習(xí)筆記3:用es2015(ES6)重寫(xiě)CommentBox

    摘要:新搭建的個(gè)人博客,本文地址學(xué)習(xí)筆記用重寫(xiě)在一開(kāi)始的時(shí)候配置中我們就加入了的支持,就是下面的配置,但之前的學(xué)習(xí)筆記都使用的完成,所以專門作一篇筆記,記錄使用完成創(chuàng)建相關(guān)文件修改,增加該入口文件修改,引入該文件做個(gè)簡(jiǎn)單的測(cè)試,看下瀏覽器全部用來(lái) 新搭建的個(gè)人博客,本文地址:React學(xué)習(xí)筆記3:用es2015(ES6)重寫(xiě)CommentBox在一開(kāi)始的時(shí)候webpack配置中我們就加入了e...

    selfimpr 評(píng)論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記(十九)--JavaScript中的函數(shù)

    摘要:方法在中定義的函數(shù)。這種聲明方式會(huì)定義一個(gè)生成器函數(shù),它返回一個(gè)對(duì)象。類用定義的類,實(shí)際上也是函數(shù)。調(diào)用函數(shù)時(shí)使用的引用,決定了函數(shù)執(zhí)行時(shí)刻的值。表示當(dāng)為時(shí),取全局對(duì)象,對(duì)應(yīng)了普通函數(shù)。四操作的內(nèi)置函數(shù)和可以指定函數(shù)調(diào)用時(shí)傳入的值。 筆記說(shuō)明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開(kāi)的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過(guò)程的一些要...

    genefy 評(píng)論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記(十九)--JavaScript中的函數(shù)

    摘要:方法在中定義的函數(shù)。這種聲明方式會(huì)定義一個(gè)生成器函數(shù),它返回一個(gè)對(duì)象。類用定義的類,實(shí)際上也是函數(shù)。調(diào)用函數(shù)時(shí)使用的引用,決定了函數(shù)執(zhí)行時(shí)刻的值。表示當(dāng)為時(shí),取全局對(duì)象,對(duì)應(yīng)了普通函數(shù)。四操作的內(nèi)置函數(shù)和可以指定函數(shù)調(diào)用時(shí)傳入的值。 筆記說(shuō)明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開(kāi)的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過(guò)程的一些要...

    lcodecorex 評(píng)論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記(十九)--JavaScript中的函數(shù)

    摘要:方法在中定義的函數(shù)。這種聲明方式會(huì)定義一個(gè)生成器函數(shù),它返回一個(gè)對(duì)象。類用定義的類,實(shí)際上也是函數(shù)。調(diào)用函數(shù)時(shí)使用的引用,決定了函數(shù)執(zhí)行時(shí)刻的值。表示當(dāng)為時(shí),取全局對(duì)象,對(duì)應(yīng)了普通函數(shù)。四操作的內(nèi)置函數(shù)和可以指定函數(shù)調(diào)用時(shí)傳入的值。 筆記說(shuō)明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開(kāi)的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過(guò)程的一些要...

    LinkedME2016 評(píng)論0 收藏0
  • es6學(xué)習(xí)筆記-頂層對(duì)象_v1.0_byKL

    摘要:學(xué)習(xí)筆記頂層對(duì)象雖然是筆記但是基本是抄了一次大師的文章了頂層對(duì)象頂層對(duì)象,在瀏覽器環(huán)境指的是對(duì)象,在指的是對(duì)象。之中,頂層對(duì)象的屬性與全局變量是等價(jià)的。的寫(xiě)法模塊的寫(xiě)法上面代碼將頂層對(duì)象放入變量。參考引用頂層對(duì)象實(shí)戰(zhàn) es6學(xué)習(xí)筆記-頂層對(duì)象_v1.0 (雖然是筆記,但是基本是抄了一次ruan大師的文章了) 頂層對(duì)象 頂層對(duì)象,在瀏覽器環(huán)境指的是window對(duì)象,在Node指的是gl...

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

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

0條評(píng)論

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