js中this的繫結

2022-01-18 16:17:33 字數 2653 閱讀 4908

人們對於this的繫結常常有兩個誤解,一:指向函式本身,二:指向函式作用域。這兩種想法都是錯的,this並不指向函式本身,也不指向函式作用域。

複製**

function foo()

foo.count = 0;

for(var i = 0 ; i<5 ; i++)

alert( foo.count ); // 0

複製**

因為this不指向函式本身,所以foo.count的值依然是0。

function foo()

var a = 2;

foo(); // 2

因為this不指向函式作用域,所以輸出的是2。

this實際上是在函式被呼叫時發生的繫結,它指向什麼完全取決於函式在**被呼叫。

this的繫結一共有四種繫結:1:預設繫結(即沒有明確的呼叫物件)

2:隱性繫結(即作為物件方法呼叫,this會被繫結到該物件)

4:new繫結(使用new來呼叫函式,會構造乙個新物件,並且把this繫結到該物件)

一:預設繫結 (即沒有明確的呼叫物件)

function foo()

var a = 2;

foo(); // 2 (非嚴格模式下)

沒有明確呼叫物件,this會被繫結到window物件,所以this.a就是window.a,即為2。不過這得在非嚴格模式下,只有在非嚴格模式下this才會被繫結到window物件,而在嚴格模式下,this被繫結到undefined。

二:隱性繫結   (即作為物件方法呼叫,this會被繫結到該物件)
複製**

function foo()

var obj = ;

obj.foo(); // 2

複製**

obj物件呼叫foo()函式,this被繫結到obj物件,所以輸出了obj物件的a的值2。

物件屬性引用鏈中只有最後一層會影響呼叫位置
複製**

function foo()

var obj2 = ;

var obj1 = ;

obj1.obj2.foo(); //2

複製**

obj1和obj2兩個物件連續呼叫,this會被繫結到最後乙個物件,即obj2,所以輸出2

隱式丟失:被隱式繫結的函式會丟失繫結物件,有兩種情況會丟失,一種為引用,另一種為**函式。

引用:

複製**

function foo()

var obj = ;

var bar = obj.foo;

var a = "global 1";

bar(); //global 1

複製**

bar是obj.foo的乙個引用,實際上它引用的是foo函式本身,所以this被繫結到window物件,輸出的是"global 1"

**函式:
複製**

function foo()

function dofoo(fn)

var obj =

var a = "global 1";

dofoo(obj.foo); //"global 1"

複製**

呼叫**函式的函式可能會修改this

複製**

function foo()

var obj = ;

foo.call(obj); // 1

複製**

call()的引數若為空,預設呼叫window物件,若為乙個原始值(字串型別,布林型別或者數字型別),則這個原始值會被轉換成它的物件形式(new string(),new boolean() 或者 new number()),這被稱為「裝箱」

硬繫結———顯示繫結的一種變形

優點:可以解決丟失繫結問題

缺點:硬繫結後不可能再修改它的this

複製**

function foo()

var obj = ;

var bar = function();

bar(); // 2

settimeout(bar,100); // 2

bar.call(window); // 2

複製**

es5中提供了內建方法function.prototype.bind

複製**

function foo(something)

var obj = ;

var bar = foo.bind(obj);

var b = bar(3); // 2 3

alert(b); // 5

複製**

bind()會返回乙個硬編碼的新函式,它會把引數設定為this的上下文並呼叫原始函式

四:new繫結(使用new來呼叫函式,會構造乙個新物件,並且把this繫結到該物件)

function foo(a)

var bar = new foo(2);

alert(bar.a); // 2

this繫結的四條規則的優先順序: new繫結 > 顯示繫結 > 隱式繫結 > 預設繫結

js中怎麼繫結事件

我們想用兩個window.onload的時候,起作用的其實是最後乙個。就和變數乙個道理,如果寫 var a 5 a 9 最後a是9 同學說,可以寫到乙個 window.onload裡面,但是實戰專案中,我們都是分工合作的,每個人都想用自己的 window.onload,這個時候就需要用到事件繫結了。...

JS中事件繫結的2種方式

首先,在body裡寫一些內容。接著,css隨便寫一下,然後在js中獲取頁面元素後開始操作 1,繫結事件方式一 on 事件名 1,只能新增乙個事件處理函式 繫結乙個 2,如果多次繫結,後面的事件會覆蓋掉前面的事件。取消繫結 事件 null 例如 元素.onclick null 2,事件繫結方式二 ad...

js事件繫結

事件繫結,常見的是odiv.nclick function 這種方式繫結事件太單一,如果繫結多個,那麼最後乙個事件會覆蓋掉之前的,也就是說只執行最後一次繫結的事件,這裡要說的是addeventlistener方法,和ie下的attachevent方法 html 如下 box son1 son2 介面...