筆記 探索js 的this 物件 第三部分

2022-07-09 12:48:11 字數 2591 閱讀 1808

了解完函式的呼叫區域是如何影響this 物件的,還有this 的各種繫結方式以及各種繫結方式的優先順序後

最後一部分,來了解一下this 的一些例外情況

1、被忽略的this

例如在使用bind 方法時候進行函式柯里化,如果此時函式並沒有打算繫結任何物件在bind() 方法的第乙個引數可以傳進乙個 null充當佔位符

例:

function

foo(a,b)

var bar = foo.bind(null,3);//

在繫結this 物件的同時傳入第乙個引數

bar(5);//

在呼叫的時候再把第二個引數傳進去

tips:

所謂函式柯里化,就是將一堆引數分配內部函式執行,最後再返回所有引數的結果

本人還沒對柯里化深入認識只能說一點皮毛

如上例,將函式繫結在乙個空物件中 就相等於把函式繫結在了全域性環境中

這樣做的方法比較危險於是有了更安全的this 繫結這一說法

把不需要做任何繫結的函式繫結在乙個空物件中(此空物件是我們自己建立的物件)

例如:通過object.create(null) 建立乙個空物件,這樣建立比 {} 這樣更空

因為省略了物件的prototype

function

foo(a,b)

var empty = object.create(null);//

建立乙個安全的 不會影響全域性作用域的空物件

//把foo 函式繫結在空物件上執行

"a: " + 2 + "b: " + 5

var fun = foo.bind(empty,6);

fun(8);

這樣的執行會更加的安全

2、間接引用

間接引用通常會產生在函式引用的賦值上

例:

function

foo()

var obj1 =

var obj2 =

var a = "window here";

(obj2.foo = obj1.foo)();

注意這裡還是那個問題,obj1 雖然是引用著函式foo

但是引用的內容僅僅是函式foo 的引用而已,this物件的繫結還是要看函式在**呼叫

此時函式 foo的呼叫位置在全域性 因此在非嚴格模式下函式輸出全域性變數 a

如需繫結物件可以把上面的引用通過硬繫結的方式去執行

書上還寫了乙個修改函式原型的軟繫結方法

if (!function.prototype.softbind) ;

bound.prototype =object.create(fn.prototype);

//修改bound 函式的原型物件為呼叫函式的原型

return bound;//

返回bound 函式

}; }

這個方法意義在於不允許函式引用全域性物件 而且比bind() 函式繫結好的一點是,當繫結完了乙個物件時下面還可以繫結其他物件而不會永遠地繫結在了一開始繫結的物件上

function

foo()

var obj1 =

var obj2 =

var obj3 =

var bar1 = foo.softbind(obj1);//

這裡通過軟繫結 將foo繫結在了obj1 上

bar1();//

當全域性變數執行時 它的this 便不再指向window而是指向了前期繫結好的obj1 上

//如果通過物件去呼叫呢?

obj2.bar1 =bar1;

obj2.bar1();

//顯示為 obj2 了

//再與原來的硬繫結 bind對比

var bar2 =foo.bind(obj1);

bar2();

//結果是輸出 obj1

obj2.bar2 =bar2;

bar2();

//這裡結果就不一樣了 foo永遠綁死在了obj1 上不能再改變了

最後介紹最後乙個特殊的函式 es6 的箭頭函式()=>

這個函式有乙個特點就是 它的this 永遠指向包含它的函式的this

看例項就懂

function

baz()

}var o1 =

var o2 =

var bat =baz.call(o2);

bat.call(o1,"a");//

即使箭頭函式在o1 內部呼叫 但是也只會輸出baz呼叫物件的屬性

其實在js 高程裡面也說過乙個問題 匿名函式的this 會指向了window

而es6 的箭頭函式正好解決了這個問題 使this 更加完整了

而在es6 語法之前我們還有乙個解決方案就是把 外部包含函式的this 物件儲存在乙個內部函式能夠放到的變數上

然後內部函式再通過這個變數呼叫外部函式能訪問的屬性即可

this物件的介紹到這裡介紹完了 我也要去擼一把特效之類的實際應用了,看太久理論真的會很累

Js第三天筆記(陣列,函式,物件)

js的一種資料結構,存放資料的。說白了就是一組資料就叫做陣列 陣列的建立方式 1.new方法建立 var arr1 newarray 2.字面量方法建立 var arr2 陣列通過 下標 索引 來訪問陣列裡面的資料和賦值 注意的是陣列的下標是從0開始的 1.new方法建立 var arr1 newa...

js物件導向第三天

函式也是物件 函式也是通過類來建立的,通過function來建立函式物件 函式是比較特殊的物件,函式的宣告是引用資料型別,通過function類建立乙個函式 new function 可以建立出來的乙個匿名物件 通過function類建立物件 函式是物件,物件是屬性的無序集合 常用的屬性 argum...

《深度探索C 物件模型》第三章讀書筆記

看之前的疑問 1.既然基類先於派生類初始化,基類的資料成員與派生類的資料成員是如何放置的?筆記 1.當初始化乙個類時,如果裡面沒有任何成員,那麼大小為1,編譯器這麼做的原因是為了讓每乙個物件都能保證獲得獨一無二的記憶體位址 2.在某些編譯器上,當類中沒有資料成員,但是卻存在虛函式時,那麼一些編譯器 ...