1. 程式人生 > >this的綁定方式

this的綁定方式

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的綁定方式