首先我們圍繞耳熟能詳的「this
始終指向它的呼叫者」開始。這句結論雖然沒有什麼問題,但是說得過於籠統,還是得深入到背後的執行原理才能舉一反三解決問題。
舉個簡單的例子:
var obj =
};var foo = obj.foo;
var num = 3;
obj.foo();//2
foo();//3
①obj.foo();
是物件obj
呼叫自身的屬性(方法)foo
,this
指向呼叫者obj
。
②由var foo = obj.foo;
獲取函式,並用foo();
在全域性作用域中呼叫函式,所以this
指向瀏覽器全域性物件window
。
js之所以設計this
,是因為其記憶體的資料結構的特徵。
var obj = ;
①上面的物件賦值給變數,其實質是js引擎現在記憶體中生成
,然後再把該物件的記憶體位址賦值給變數obj
。也就是說onj.foo
實質上是先從obj
獲取物件的記憶體位址然後再從位址讀取原始物件,最後返回物件屬性foo
的值。
②原始物件以詞典結構儲存,乙個屬性名對應乙個屬性描述物件。如下圖,foo
屬性的描述物件就包含4個描述屬性,而最重要的值儲存在描述物件[[value]]
中。
當foo
屬性值為函式時,js引擎同樣會先將原始函式儲存在記憶體中,然後把該函式的記憶體位址存放於foo
屬性的描述物件中的[[value]]
裡面。
從原理出發章節參考於j**ascript 的 this 原理——阮一峰的網路日誌我們需要js在函式體內部可以引用當前環境的其他內部變數,就像這樣:
var f = function () ;
var x = 1;//實質給全域性物件window新增屬性 x 並賦值 1
var obj =
f();//結果為1,執行於全域性環境,所以 this.x 指向 window.x
boj.f();//結果為2,執行於 obj 內部環境,所以 this.x 指向 obj.x
這就說明了造就this
的目的就是為函式內部的語句指定當前執行環境,而當前執行環境不一定就是該函式內部環境哈。
function name () ;
var a = new name();
console.log(a.fne);//yulin
關於這個建構函式這裡先籠統提一些,new
關鍵字會建立乙個空物件name
,並且會將函式name()
的保留在[[prototype]]
原型中而且會執行該函式並返回執行結果(這裡有幾種情況下文會提到),最後整個物件name
賦值給變數a
,a
即是物件例項。所以this.fne
指向a.fne
。
上文說到建構函式執行的返回結果的有幾種情況:
返回物件時,this
會指向返回的物件,null
除外,否則指向起始呼叫者。
function name ()
};var a = new name();
console.log(a.fne);//undefined,指向 {}
function name ()
};var a = new name();
console.log(a.fne);//undefined,指向 function () {}
function name () ;
var a = new name();
console.log(a.fne);//yulin,指向 null,null是特殊的物件不會更改 this
function name () ;
var a = new name();
console.log(a.fne);//yulin,指向 name {}
當我們需要在a物件中呼叫b物件的方法時,我們就需要用到call()
方法指定目的執行環境。
const a =
};const b =
var x = a.fn
x.call(b, 2, 3);//yhh 5
const a =
};const b =
var x = a.fn
/*以下**效果一樣
let arr = [2, 3];
*/
請注意:const a =
};const b =
var x = a.fn
x.bind(b);
/*ƒ (e, q) */
let y = x.bind(b);
y(2, 3);//yhh 5
js深入淺出 型別轉換
隱式轉換 1.是賦值 2.嚴格模式 先判斷型別,再判斷值 console.log 123 123 false console.log null undefined false console.log undefined undefined true 3.如圖 2.一邊是數值,一邊是字串,字串會轉數值...
深入淺出JS 作用域
作用域是什麼呢?它是指的 在執行時,變數 函式或者物件的可訪問性?還是乙個變數和函式的作用範圍?又或是如 know js 中所說的作用域是根據名稱查詢變數的一套規則呢,又或是指的當前 的執行環境?在筆者的眼裡,作用域所指的是規則,一套用來管理變數和函式的作用範圍的規則。var userinfo a ...
深入淺出sizeof
int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...