人們對於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 介面...