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

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript中的this

xuxueli / 1548人閱讀

摘要:函數(shù)定義在全局作用域中,引用了對(duì)象,調(diào)用函數(shù)之前,的值并不確定,可能會(huì)在代碼執(zhí)行過(guò)程中引用不同的對(duì)象。在全局環(huán)境中調(diào)用函數(shù)時(shí),引用的就是全局對(duì)象。這兩個(gè)方法的用途都是在特定的作用域中調(diào)用函數(shù),實(shí)際上等于設(shè)置函數(shù)體內(nèi)對(duì)象的值。

本文首發(fā)于知乎專(zhuān)欄:前端指南

this是函數(shù)內(nèi)部的一個(gè)特殊對(duì)象,它引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象。

全局環(huán)境下的this

當(dāng)在網(wǎng)頁(yè)的全局作用域中調(diào)用函數(shù)時(shí),this對(duì)象引用的就是window。

console.log(this);//Window

function f() {
    return this;
}
f();//Window

函數(shù)f()定義在全局作用域中,引用了this對(duì)象,調(diào)用函數(shù)之前,this的值并不確定,可能會(huì)在代碼執(zhí)行過(guò)程中引用不同的對(duì)象。在全局環(huán)境中調(diào)用函數(shù)f()時(shí),this引用的就是全局對(duì)象Window。

對(duì)象中的this

將一個(gè)函數(shù)賦給對(duì)象,通過(guò)對(duì)象調(diào)用這個(gè)函數(shù),它們的this是調(diào)用該函數(shù)的對(duì)象。

var o = {
    color: "blue",
    sayColor: function () {
        return this.color;
    }
};

o.sayColor();//blue

將函數(shù)sayColor賦給對(duì)象o,o.sayColor()被調(diào)用時(shí),函數(shù)內(nèi)部的this被綁定到o
我們也可以用如下方法:

var o = { color: "blue" };

function sayColor() {
    return this.color;
}

o.sayColor = sayColor;
o.sayColor();//blue

函數(shù)的名字僅僅是一個(gè)包含指針的變量,在何處定義調(diào)用函數(shù)不會(huì)影響到this的行為,全局的sayColor()與o.sayColor()指向的是同一個(gè)函數(shù)。

構(gòu)造函數(shù)中的this

函數(shù)或方法之前帶有關(guān)鍵字new,它就構(gòu)成了構(gòu)造函數(shù)調(diào)用。通過(guò)構(gòu)造函數(shù)生成一個(gè)新的對(duì)象,this指向新對(duì)象、

function person() {
    this.name = "Jack";
}
var o = new person();
console.log(o.name);//Jack
apply和call

每個(gè)函數(shù)都包含兩個(gè)非繼承而來(lái)的方法,apply()和call()。這兩個(gè)方法的用途都是在特定的作用域中調(diào)用函數(shù),實(shí)際上等于設(shè)置函數(shù)體內(nèi)this對(duì)象的值。首先apply()方法接收兩個(gè)參數(shù):一個(gè)是在其中運(yùn)行函數(shù)的作用域,另一個(gè)是參數(shù)數(shù)組。其中,第二個(gè)參數(shù)可以是Array實(shí)例,也可以是 arguments對(duì)象。

function sum(num1, num2) {
    return num1 + num2;
}
function callSum1(num1, num2) {
    return sum.apply(this, arguments);
}
function callSum2(num1, num2) {
    return sum.apply(this, [num1, num2]);
}
console.log(callSum1(10, 10));//20
console.log(callSum2(10, 10));//20

上邊這個(gè)例子中,callSum1()在執(zhí)行sum()函數(shù)時(shí)傳入了this作為this值(在作用域中調(diào)用的,傳入的就是window對(duì)象)和arguments對(duì)象。而callSum2()也調(diào)用了sum()函數(shù),但傳入的是this和一個(gè)參數(shù)數(shù)組。

注:在嚴(yán)格模式下,未指定環(huán)境對(duì)象而調(diào)用函數(shù),則this值不會(huì)被轉(zhuǎn)型為window,除非明確把函數(shù)添加到某個(gè)對(duì)象或者調(diào)用apply()或call(),否則this值是undefined。

call()與apply()方法作用相同,區(qū)別僅僅在于接收參數(shù)方式不同,對(duì)call()而言,第一個(gè)參數(shù)是this沒(méi)有變化,不同的是其余參數(shù)都直接傳遞給函數(shù)。換句話(huà)說(shuō),在使用call()方法時(shí),傳遞給函數(shù)的參數(shù)必須逐個(gè)列舉出來(lái)。

function sum(num1, num2) {
    return num1 + num2;
}
function callSum(num1, num2) {
    return sum.call(this, num1, num2);
}
console.log(callSum(10, 10));//20

call()和apply()真正強(qiáng)大的地方在于能擴(kuò)充函數(shù)賴(lài)以運(yùn)行的作用域。

window.color = "red";
var o = { color: "blue" };
function sayColor() {
    console.log(this.color);
}
sayColor();//red
sayColor.call(this);//red
sayColor.call(window);//red
sayColor.call(o);//blue

使用call()或者apply()擴(kuò)充作用域最大的好處,就是對(duì)象不需要與方法有任何耦合關(guān)系。

bind

ES5還定義了bind,這個(gè)方法會(huì)創(chuàng)建一個(gè)函數(shù)的實(shí)例,其this值會(huì)被綁定傳給bind()函數(shù)的值

window.color = "red";
var o = { color: "blue" };
function sayColor() {
    console.log(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor();//blue

在sayColor()調(diào)用bind()并傳入對(duì)象o,創(chuàng)建了objectSayColor()函數(shù),該函數(shù)的this值等于o因此即使在全局作用域中調(diào)用這個(gè)函數(shù),也會(huì)看到“blue”。

閉包中的this

閉包中使用this對(duì)象可能會(huì)導(dǎo)致一些問(wèn)題,this對(duì)象在運(yùn)行時(shí)是基于函數(shù)的執(zhí)行環(huán)境對(duì)象的:在全局函數(shù)中,this等于window,而當(dāng)函數(shù)被作為某個(gè)對(duì)象方法調(diào)用時(shí),this等于那個(gè)對(duì)象。匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其this對(duì)象通常指向window。

var color = "red";
var o = {
    name: "blue",
    sayColor: function () {
        return function () {
            return this.color;
        };
    }
}
console.log(o.sayColor()());//red
//改進(jìn)
var o = {
    color: "blue",
    sayColor: function () {
        var that = this;
        return function () {
            return that.color;
        };
    }
}
console.log(o.sayColor()());//blue
ES6中箭頭函數(shù)中的this

this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象。但是在使用箭頭函數(shù)時(shí),函數(shù)體內(nèi)的this對(duì)象,就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象。箭頭函數(shù)的使用可參考鏈接
http://es6.ruanyifeng.com/#do...

function foo() {
    setTimeout(() => {
        console.log("id:", this.id);
    }, 100)
}
var id = 21;
foo.call({ id: 42 });//id:42

箭頭函數(shù)中的this指向foo的this,箭頭函數(shù)中也不存在arguments,指向外層函數(shù)foo對(duì)象的arguments。

由于箭頭函數(shù)沒(méi)有自己的this,所以也不能用call()、apply()、bind()改變this的指向。

綁定this

函數(shù)綁定運(yùn)算符是::,雙冒號(hào)是左邊是一個(gè)對(duì)象,右邊是一個(gè)函數(shù)。該運(yùn)算符會(huì)自動(dòng)將左邊的對(duì)象作為上下文環(huán)境(this對(duì)象),綁定到右邊函數(shù)上。詳細(xì)可參考鏈接
http://es6.ruanyifeng.com/#do...

foo::bar;
//等同于
bar.bind(foo);

在判斷this指向時(shí),要記住,在沒(méi)有綁定this的情況下,this動(dòng)態(tài)綁定,指向運(yùn)行時(shí)的環(huán)境,而非代碼中的位置,只有箭頭函數(shù)才是靜態(tài)綁定,將this綁定到代碼中的位置。

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

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

相關(guān)文章

  • JavaScript深入淺出

    摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類(lèi)繼承還要強(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ō)是阿里的前端妹子寫(xiě)的) this 的值到底...

    blair 評(píng)論0 收藏0
  • 學(xué)習(xí)React之前你需要知道的的JavaScript基礎(chǔ)知識(shí)

    摘要:和類(lèi)在開(kāi)始時(shí)遇到類(lèi)組件,只是需要有關(guān)類(lèi)的基礎(chǔ)。畢竟,中的條件呈現(xiàn)僅再次顯示大多數(shù)是而不是特定的任何內(nèi)容。 在我的研討會(huì)期間,更多的材料是關(guān)于JavaScript而不是React。其中大部分歸結(jié)為JavaScript ES6以及功能和語(yǔ)法,但也包括三元運(yùn)算符,語(yǔ)言中的簡(jiǎn)寫(xiě)版本,此對(duì)象,JavaScript內(nèi)置函數(shù)(map,reduce,filter)或更常識(shí)性的概念,如:可組合性,可重用...

    bitkylin 評(píng)論0 收藏0
  • JavaScript中的面向?qū)ο螅╫bject-oriented)編程

    摘要:對(duì)象在中,除了數(shù)字字符串布爾值這幾個(gè)簡(jiǎn)單類(lèi)型外,其他的都是對(duì)象。那么在函數(shù)對(duì)象中,這兩個(gè)屬性的有什么區(qū)別呢表示該函數(shù)對(duì)象的原型表示使用來(lái)執(zhí)行該函數(shù)時(shí)這種函數(shù)一般成為構(gòu)造函數(shù),后面會(huì)講解,新創(chuàng)建的對(duì)象的原型。這時(shí)的函數(shù)通常稱(chēng)為構(gòu)造函數(shù)。。 本文原發(fā)于我的個(gè)人博客,經(jīng)多次修改后發(fā)到sf上。本文仍在不斷修改中,最新版請(qǐng)?jiān)L問(wèn)個(gè)人博客。 最近工作一直在用nodejs做開(kāi)發(fā),有了nodejs,...

    JerryZou 評(píng)論0 收藏0
  • JavaScript進(jìn)階之’this

    摘要:所以相同點(diǎn)是,在全局范圍內(nèi),全局變量終究是屬于老大的。只生效一次引入了。只生效一次在箭頭函數(shù)中,與封閉詞法環(huán)境的保持一致。我通常把這些原始函數(shù)叫做構(gòu)造函數(shù)。在里面你可以嵌套函數(shù),也就是你可以在函數(shù)里面定義函數(shù)。 showImg(https://img-blog.csdnimg.cn/20190522000008399.jpg?x-oss-process=image/watermark,...

    shenhualong 評(píng)論0 收藏0
  • 理解 JavaScript 中的 this 關(guān)鍵字

    摘要:原文許多人被中的關(guān)鍵字給困擾住了,我想混亂的根源來(lái)自人們理所當(dāng)然地認(rèn)為中的應(yīng)該像中的或中的一樣工作。盡管有點(diǎn)難理解,但它的原理并不神秘。在瀏覽器中,全局對(duì)象是對(duì)象。運(yùn)算符創(chuàng)建一個(gè)新對(duì)象并且設(shè)置函數(shù)中的指向調(diào)用函數(shù)的新對(duì)象。 原文:Understanding the this keyword in JavaScript 許多人被JavaScript中的this關(guān)鍵字給困擾住了,我想混亂的...

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

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

0條評(píng)論

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