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

資訊專(zhuān)欄INFORMATION COLUMN

全面解析this

Y3G / 970人閱讀

摘要:在嚴(yán)格模式下,對(duì)象的函數(shù)中的指向調(diào)用函數(shù)的對(duì)象實(shí)例顯式綁定,,通過(guò)可以把的綁定到上。間接引用最容易在賦值時(shí)發(fā)生返回目標(biāo)函數(shù)的引用詞法之前介紹的種綁定規(guī)則可以包含所有正常的函數(shù),但是中介紹了一種無(wú)法使用這些規(guī)則的特殊函數(shù)類(lèi)型箭頭函數(shù)。

this到底指向什么?
this關(guān)鍵詞是javaScript中最復(fù)雜的機(jī)制之一,一般有兩個(gè)誤區(qū):
1.this指向函數(shù)自身;
2.this指向函數(shù)的作用域;

this是指向調(diào)用位置,調(diào)用位置就是函數(shù)在代碼中被調(diào)用的位置(而不是聲明的位置),this的綁定規(guī)則主要有4條,我們?cè)谑褂脮r(shí)能判斷它屬于哪種規(guī)則即可;

1.默認(rèn)綁定

首先介紹最常用的函數(shù)調(diào)用類(lèi)型:獨(dú)立函數(shù)調(diào)用,可以理解為這是一條在無(wú)法應(yīng)用其他規(guī)則的默認(rèn)規(guī)則,非嚴(yán)格模式下,this指向全局對(duì)象,即window

var a = 2;
function foo(){
    var a = 1;
    console.log(this.a)
}
foo(); 



// 2
很明顯這里的this指向window對(duì)象,但嚴(yán)格模式下呢?
var a = 1;
function foo(){
    "use strict"
    console.log(this.a)
}
foo(); 



// TypeError:this is undefined
嚴(yán)格模式下函數(shù)中的this指向undefined
"use strict";
 
console.log(this === window); // false? // true?
this.a = 9804;
console.log(window.a); // undefined?  // 9804?




// true
// 9804

但全局中的this指向window

2.隱式綁定

先看一段代碼

function foo(){
    console.log(this.a)
}
var a = 1;
var obj = {
    a:2,
    foo:foo
}
obj.foo(); // ?



// 2
當(dāng)函數(shù)引用有上下文對(duì)象時(shí),隱式綁定規(guī)則會(huì)把函數(shù)調(diào)用中的this綁定到這個(gè)上下文對(duì)象,可以記住一點(diǎn):誰(shuí)調(diào)用綁到誰(shuí)身上。

再看一段代碼:

function foo(){
    console.log(this.a)
}
var obj2 = {
    a:42,
    foo:foo
}
var obj1 = {
    a:2,
    obj2:obj2
}
obj1.obj2.foo(); // ?



 // 42
對(duì)象屬性引用鏈中只有上一層或者最后一層才起作用。
"use strict";
 
var o = new Object();
o.a = "obj.a";
o.f5 = function(){
    return this.a;
}
console.log(o.f5());// ?



// obj.a

在嚴(yán)格模式下,對(duì)象的函數(shù)中的this指向調(diào)用函數(shù)的對(duì)象實(shí)例

3.顯式綁定
apply,call,bind
function foo(){
    console.log(this.a)
}
var a = 1;
var obj = {
    a:2
}
foo.call(obj);// ?



// 2
通過(guò)foo.call()可以把foo的this綁定到obj上。
var obj1 = {
    a: 1,
    b: 2,
    caculate: function(c,d){
        return this.a + this.b + c + d;
    }
};
var obj2 = {
    a: 10,
    b: 20,
};
console.log( obj1.caculate(3,4) ); // ?
console.log( obj1.caculate.call( obj2, 3, 4 ) ); // ?
console.log( obj1.caculate.apply( obj2, [30, 40] ) ); // ?



// 10
// 37
// 100
call 和 apply 的用法唯一的不同就是傳參的方式不同,參見(jiàn)上面兩種調(diào)用方式

(1)硬綁定
看下面代碼:

var a = 1;
function foo(){
    console.log(this.a)
}
var obj = {
    a:2
}
var bar = function(){
    foo.call(obj)
}
bar();// ?
setTimeout(bar,100);// ?
//硬綁定的bar不可能再修改它的this
bar.call(window); // ?



// 2
// 2
// 2
無(wú)論何時(shí)調(diào)用bar函數(shù),都會(huì)手動(dòng)obj上調(diào)用foo,這種就是一種顯示的強(qiáng)制綁定,即硬綁定。硬綁定的典型場(chǎng)景就是創(chuàng)建一個(gè)包裹函數(shù)
由于硬綁定是一種常用的模式,所以ES5提供的內(nèi)置的方法Function.prototype.bind,它的用法如下:
function foo(something){
    console.log(this.a ,something);
    return this.a + something
}
var obj = {
    a:2
}
var bar = foo.bind(obj);
var b = bar(3);
console.log(b);



// 2 3
// 5
bind(..)會(huì)返回一個(gè)硬編碼的新函數(shù),它會(huì)把你指定的參數(shù)設(shè)置為this的上下文并調(diào)用原始函數(shù),但是Ta是永久綁定,一旦綁定不會(huì)在改變:
4.new綁定

當(dāng)用 new 運(yùn)算符調(diào)用函數(shù)時(shí),該函數(shù)總會(huì)返回一個(gè)對(duì)象,通常情況下,如果構(gòu)造器不顯式地返回任何數(shù)據(jù),或者是返回一個(gè)非對(duì)象類(lèi)型的數(shù)據(jù),構(gòu)造器里的 this 就指向返回的這個(gè)對(duì)象,

var MyClass = function(){
    this.name = "sven";
    return "anne"; // 返回 string 類(lèi)型
};
var obj = new MyClass();
console.log(obj)  // ?
console.log(obj.name); // ?



// {name: "sven"}
// 輸出: sven
var MyClass = function(){
    this.name = "sven";
    return { // 顯式地返回一個(gè)對(duì)象
        name: "anne"
    }
};
var obj = new MyClass();
console.log( obj);   // ?



// 輸出: {name: "anne"}
"use strict";
 
console.log("嚴(yán)格模式");
console.log("構(gòu)造函數(shù)中的this");
function constru(){
    this.a = "constru-a";
    this.f2 = function(){
        console.log(this.b);
        return this.a;
    }
}
var o2 = new constru(); // ?
o2.b = "o2-b";
console.log(o2.f2()); // ?



// o2-b
// constru-a
在嚴(yán)格模式下,構(gòu)造函數(shù)中的this指向構(gòu)造函數(shù)創(chuàng)建的對(duì)象實(shí)例
四種綁定規(guī)則的優(yōu)先級(jí)
new綁定>顯式綁定>隱式綁定>默認(rèn)綁定
被忽略的this

如果你把null或者undefined作為this的綁定對(duì)象傳入call、apply或者bind,這些值在調(diào)用時(shí)會(huì)被忽略,實(shí)際應(yīng)用的是默認(rèn)綁定規(guī)則:

function foo(){
    console.log(this.a)
}
var a = 2;
foo.call(null); // ?



// 2
間接引用

另一個(gè)需要注意的是,你有可能無(wú)意的創(chuàng)建一個(gè)函數(shù)的“間接引用”,這種情況下,調(diào)用函數(shù)會(huì)應(yīng)用默認(rèn)規(guī)則。間接引用最容易在賦值時(shí)發(fā)生:

function foo() {
    console.log(this.a);
  }
  var a = 2;
  var o = { a: 3, foo: foo};
  var p = { a: 4 };

  o.foo();
  (p.foo = o.foo)(); // 返回目標(biāo)函數(shù)的引用




//3
//2
this詞法

之前介紹的4種綁定規(guī)則可以包含所有正常的函數(shù),但是ES6中介紹了一種無(wú)法使用這些規(guī)則的特殊函數(shù)類(lèi)型:箭頭函數(shù)
箭頭函數(shù)this的定義:箭頭函數(shù)中的this是在定義函數(shù)的時(shí)候綁定,而不是在執(zhí)行函數(shù)的時(shí)候綁定。

function foo(){
    //返回一個(gè)箭頭函數(shù)
    return (a) => {
        //this繼承自foo()
        console.log(this.a)
    }
}
var obj1 = {
    a:2
}
var obj2 = {
    a:3
}
var bar = foo.call(obj1);
bar.call(obj2); // ?



// 2, 不是3
foo()內(nèi)部創(chuàng)建的箭頭函數(shù)會(huì)捕獲調(diào)用時(shí)foo()的this,由于foo()的this綁定到obj1,bar(引用箭頭函數(shù))的this也會(huì)綁定到obj1,箭頭函數(shù)的綁定無(wú)法被修改
小結(jié)
1.由new調(diào)用?綁定到新創(chuàng)建的對(duì)象。
2.由call或者apply(或者bind)調(diào)用?綁定到指定的對(duì)象。
3.由上下文對(duì)象調(diào)用?綁定到那個(gè)上下文對(duì)象。
4.默認(rèn):在嚴(yán)格模式下綁定到undefined,否則綁定到全局對(duì)象。
ES6中的箭頭函數(shù)并不會(huì)用這4種綁定規(guī)則,而是根據(jù)詞法作用域來(lái)決定this,具體來(lái)說(shuō),箭頭函數(shù)會(huì)繼承外層函數(shù)調(diào)用的this綁定。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/105700.html

相關(guān)文章

  • 全面解析JS中的this

    摘要:當(dāng)我們不想再對(duì)象內(nèi)部間接包含引用函數(shù),而像在某個(gè)對(duì)象上強(qiáng)制調(diào)用函數(shù)。我們可以用中內(nèi)置的和的方法來(lái)實(shí)現(xiàn),這兩個(gè)方法的第一個(gè)參數(shù)是一個(gè)對(duì)象,是給準(zhǔn)備的,接著再調(diào)用函數(shù)時(shí)將其綁定到。 this是什么 在javascript中,每個(gè)執(zhí)行上下文可以抽象成一組對(duì)象showImg(https://segmentfault.com/img/bVuKR7); 而this是與執(zhí)行上下文相關(guān)的特殊對(duì)象,任何...

    calx 評(píng)論0 收藏0
  • 關(guān)于this全面解析(下)

    摘要:關(guān)于的全棉解析上的文章地址判斷函數(shù)是否在中調(diào)用綁定如果是的話(huà)綁定的是新創(chuàng)建的對(duì)象。顯而易見(jiàn),這種方式可能會(huì)導(dǎo)致許多難以分析和追蹤的。默認(rèn)在嚴(yán)格模式下綁定到,否則綁定到全局對(duì)象。 關(guān)于this的全棉解析(上)的文章地址 判斷this 函數(shù)是否在new中調(diào)用(new綁定)?如果是的話(huà)this綁定的是新創(chuàng)建的對(duì)象。 bar = new foo() 函數(shù)是否通過(guò)call、apply(顯式綁定...

    philadelphia 評(píng)論0 收藏0
  • 關(guān)于this全面解析(上)

    摘要:關(guān)于的全面解析下頁(yè)面鏈接的調(diào)用位置調(diào)用位置就是函數(shù)在代碼中被調(diào)用的位置而不是聲明的位置,尋找調(diào)用位置就是尋找函數(shù)被調(diào)用的位置,最重要的是分析調(diào)用棧就是為了到達(dá)當(dāng)前執(zhí)行位置所調(diào)用的所有函數(shù)。因此,調(diào)用函數(shù)時(shí)被綁定到這個(gè)對(duì)象上,所以和是一樣的。 關(guān)于this的全面解析(下)頁(yè)面鏈接 this的調(diào)用位置 調(diào)用位置就是函數(shù)在代碼中被調(diào)用的位置(而不是聲明的位置),尋找調(diào)用位置就是尋找函數(shù)被調(diào)用...

    caige 評(píng)論0 收藏0
  • 【進(jìn)階3-1期】JavaScript深入之史上最全--5種this綁定全面解析

    摘要:在嚴(yán)格模式下調(diào)用函數(shù)則不影響默認(rèn)綁定。回調(diào)函數(shù)丟失綁定是非常常見(jiàn)的。因?yàn)橹苯又付ǖ慕壎▽?duì)象,稱(chēng)之為顯示綁定。調(diào)用時(shí)強(qiáng)制把的綁定到上顯示綁定無(wú)法解決丟失綁定問(wèn)題。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開(kāi)始前端進(jìn)階的第三期,本周的主題是this全面解析,今天是第9天。 本計(jì)劃一共28期,每期重點(diǎn)攻克一個(gè)面試重...

    xavier 評(píng)論0 收藏0
  • this全面解析(二)

    摘要:在傳統(tǒng)的面向類(lèi)的語(yǔ)言中,構(gòu)造函數(shù)是類(lèi)中的一些特殊方法,使用初始化類(lèi)是會(huì)調(diào)用類(lèi)中的構(gòu)造函數(shù)。 在上一節(jié)中我們?cè)敿?xì)介紹了this的兩種綁定方式,默認(rèn)綁定和隱式綁定,在這一節(jié)我們繼續(xù)介紹this的另外兩種綁定方式顯示綁定和new綁定。那么,我們要解決的問(wèn)題當(dāng)然就是上一節(jié)中我們提到的:this丟失! 顯式綁定 在隱式綁定中,我們必須在一個(gè)對(duì)象的內(nèi)部包含一個(gè)指向函數(shù)的屬性,并通過(guò)這個(gè)屬性間接引用...

    iflove 評(píng)論0 收藏0
  • this全面解析(一)

    摘要:調(diào)用棧就是為了到達(dá)當(dāng)前執(zhí)行位置所調(diào)用的所有函數(shù)。由于無(wú)法控制回調(diào)函數(shù)的執(zhí)行方式,因此就沒(méi)有辦法控制調(diào)用位置得到期望的綁定,下一節(jié)我們會(huì)介紹如何通過(guò)固定來(lái)修復(fù)這個(gè)問(wèn)題。 在《你不知道的this》中我們排除了對(duì)于this的錯(cuò)誤理解,并且明白了每個(gè)函數(shù)的this是在調(diào)用時(shí)綁定的,完全取決于函數(shù)的調(diào)用位置。在本節(jié)中我們主要介紹一下幾個(gè)主要內(nèi)容: 什么是調(diào)用位置 綁定規(guī)則 this詞法 調(diào)用...

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

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

0條評(píng)論

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