this的綁定方式
阿新 • • 發佈:2017-05-05
script 執行 var 默認 foreach 不知道 可能 表達 原型
默認綁定
函數調用時綁定window,在嚴格模式下不會綁定到全局對象
function foo(){ console.log(this.a); } var a = 10; foo(); function foo2(){ "use strict" console.log(this.a); } foo2();
隱式綁定
將this綁定到上下文對象中
function foo() { console.log( this.a ); } var obj = { a: 2, foo: foo }; obj.foo(); // 2
function foo() { console.log(this.a ); } var obj2 = { a: 42, foo: foo }; var obj1 = { a: 2, obj2: obj2 }; obj1.obj2.foo(); // 42
隱式丟失
函數丟失綁定導致默認綁定,此時this綁定到全局對象,undefined上(嚴格模式下)
function foo() { console.log( this.a ); } var obj = { a: 2, foo: foo }; var bar = obj.foo; // 函數別名! var a = "oops, global"; // a 是全局對象的屬性 bar(); // "oops, global"
顯示綁定
使用call和apply進行顯示綁定
變式 硬綁定
function foo() { console.log( this.a ); } var obj = { a:2 }; var bar = function() { foo.call( obj ); }; bar(); // 2 setTimeout( bar, 100 ); // 2 // 硬綁定的bar 不可能再修改它的this bar.call( window ); // 2
api調用上下文
function foo(el) { console.log( el, this.id ); } var obj = { id: "awesome" };// 調用foo(..) 時把this 綁定到obj [1, 2, 3].forEach( foo, obj ); // 1 awesome 2 awesome 3 awesome
new 綁定
1. 創建(或者說構造)一個全新的對象。
2. 這個新對象會被執行[[ 原型]] 連接。
3. 這個新對象會綁定到函數調用的this。
4. 如果函數沒有返回其他對象,那麽new 表達式中的函數調用會自動返回這個新對象。
來自<你不知道的javaScript>
this的綁定方式