摘要:姑且理解為調(diào)用域,為調(diào)用棧。如下代碼可以輔助我們理解在中調(diào)用所以的調(diào)用域是,此時(shí)的調(diào)用棧只有而本身暴露在全局作用域中,所以它的調(diào)用域則也在全局作用域中。
show code
function foo() { console.log( this.a ); } var obj = { a: 2, foo: foo }; obj.foo(); // 2
this指向了obj,因?yàn)?b>foo執(zhí)行時(shí)的call-site(可以理解為調(diào)用時(shí)所在作用域)在obj上面。注意是運(yùn)行的時(shí)候,和在哪里聲明的沒(méi)有關(guān)系。
call-site and call-stackcall-site姑且理解為調(diào)用域,call-stack為調(diào)用棧。如下代碼可以輔助我們理解
function baz() { // call-stack is: `baz` // so, our call-site is in the global scope console.log( "baz" ); bar(); // <-- call-site for `bar` }
在baz()中調(diào)用bar(),所以bar的調(diào)用域是baz,此時(shí)bar的調(diào)用棧只有baz;而baz本身暴露在全局作用域中,所以它的調(diào)用域則也在全局作用域中。
function bar() { // call-stack is: `baz` -> `bar` // so, our call-site is in `baz` console.log( "bar" ); foo(); // <-- call-site for `foo` } function foo() { // call-stack is: `baz` -> `bar` -> `foo` // so, our call-site is in `bar` console.log( "foo" ); } baz(); // <-- call-site for `baz`
理解之后再回頭看開(kāi)頭的例子,是不是感覺(jué)清晰了很多。其實(shí)this只是指向了它的call-site
還有如下玩法:
function foo() { console.log( this.a ); } var obj2 = { a: 42, foo: foo }; var obj1 = { a: 2, obj2: obj2 }; obj1.obj2.foo(); // 42Implicitly Lost(隱式丟失)
function foo() { console.log( this.a ); } var obj = { a: 2, foo: foo }; var bar = obj.foo; // function reference/alias! var a = "oops, global"; // `a` also property on global object bar(); // "oops, global"
雖然bar引用了obj上的foo,但實(shí)際上相當(dāng)于是直接對(duì)foo引用而已,所以會(huì)默認(rèn)綁定到全局。
function foo() { console.log( this.a ); } function doFoo(fn) { // `fn` is just another reference to `foo` fn(); // <-- call-site! } var obj = { a: 2, foo: foo }; var a = "oops, global"; // `a` also property on global object doFoo( obj.foo ); // "oops, global"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78716.html
摘要:但在嚴(yán)格模式下默認(rèn)綁定不起作用顯式綁定顯式綁定用到了和方法,因?yàn)榭梢灾苯又付ǖ慕壎▽?duì)象,因此稱之為顯式綁定。隱式綁定顯式綁定當(dāng)我們使用顯式綁定時(shí),輸出的值為的值所以顯式綁定的優(yōu)先級(jí)更高。 上篇文章介紹了this的隱式綁定(implicit binding),接著介紹this其他三種綁定方式 默認(rèn)綁定 (Default Binding) 顯式綁定 (Explicit Binding) ...
摘要:在這篇文章中,他介紹了一種實(shí)現(xiàn)繼承的方法,這種方法并沒(méi)有使用嚴(yán)格意義上的構(gòu)造函數(shù)。的左值一般是一個(gè)對(duì)象,右值一般是一個(gè)構(gòu)造函數(shù),用來(lái)判斷左值是否是右值的實(shí)例。 __proto__ 探究 __proto__隱式原型與prototype顯式原型是個(gè)容易令人混淆的概念,簡(jiǎn)而言之prototype是構(gòu)造函數(shù)用來(lái)被自己的實(shí)例繼承的原型,而_proto_是實(shí)例用來(lái)繼承父類原型的載體。 1. 是什么...
摘要:和的關(guān)系先上答案對(duì)象上都有屬性函數(shù)也是對(duì)象一般情況下對(duì)象的屬性指向該對(duì)象的構(gòu)造函數(shù)的原型對(duì)象。兩者的關(guān)系先上一張神圖每個(gè)被構(gòu)造函數(shù)創(chuàng)建出來(lái)的對(duì)象都有一個(gè)隱式引用,指向其構(gòu)造函數(shù)的屬性的值。 showImg(https://segmentfault.com/img/bVbnO8K); __proto__ 和 prototype的關(guān)系 先上答案: ? 對(duì)象上都有__proto__屬...
摘要:瀏覽器總是運(yùn)行位于作用域鏈頂部的當(dāng)前執(zhí)行上下文。作用域的前端永遠(yuǎn)是當(dāng)前執(zhí)行代碼所在環(huán)境的變量對(duì)象而全局執(zhí)行環(huán)境的變量對(duì)象始終是作用域鏈中的最后一個(gè)對(duì)象。調(diào)用棧為了達(dá)到當(dāng)前執(zhí)行位置所調(diào)用的所有函數(shù)。 ECMAScript中的變量值類型 基本類型 : Number, String, Boolean, Undefined, Null 引用類型 : Object, Array, Func...
摘要:關(guān)于的指向問(wèn)題算的上是中的一個(gè)十分重要的問(wèn)題了。首先,的指向問(wèn)題可以用一句話總結(jié)就是總是指向調(diào)用的對(duì)象,也就是說(shuō)指向誰(shuí)與函數(shù)聲明的位置沒(méi)有關(guān)系,只與調(diào)用的位置有關(guān)。此外注意幾種特殊情況,特別是中的箭頭函數(shù)。 關(guān)于this的指向問(wèn)題算的上是js中的一個(gè)十分重要的問(wèn)題了。今天把這個(gè)問(wèn)題總結(jié)下,加深下自己對(duì)this的理解。首先,this的指向問(wèn)題可以用一句話總結(jié)就是:this總是指向調(diào)用的對(duì)...
閱讀 2027·2021-11-15 11:38
閱讀 2059·2019-08-30 15:55
閱讀 2195·2019-08-30 15:52
閱讀 3178·2019-08-30 14:01
閱讀 2698·2019-08-30 12:47
閱讀 1163·2019-08-29 13:17
閱讀 1075·2019-08-26 13:55
閱讀 2641·2019-08-26 13:46