this
2017-09-30 本文已影响0人
yyyzhen
概念
当一个函数被调用时,会创建一个活动记录(有时也称为执行上下文)。这个记录会包含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息。this就是这个记录的一个属性,会在函数执行的过程中用到
this的四条调用规则:
- 默认绑定:在严格模式下绑定到undefined,否则绑定到全局对象
var a = 1
function foo() {
console.log(this.a)
}
foo() // 1
上例中,函数调用时应用了this的默认绑定,因此this指向全局变量。
- 隐式绑定:由上下文对象调用?绑定到那个上下文对象。
var a = 3
function foo() {
console.log(this.a)
}
var obj = {
a: 2,
fn: foo
}
obj.fn() // 2
上例中,函数foo在被调用时,调用位置会用obj的上下文来引用函数,当函数拥有上下文对象时,隐式绑定规则会把函数调用中的this绑定到这个上下文对象,因此,this指向obj。
- 显式绑定:由call或者apply(或者bind)调用?绑定到指定的对象。
var a = 2
function foo() {
console.log(this.a)
}
var obj = {
a: 3
}
foo.call(obj) \\ 3
上例中,通过foo.call(...),我们在调用foo时强制把它的this绑定到obj上。
- new调用:由new调用?绑定到新创建的对象。
function Foo() {
console.log(this)
}
var fn = new Foo() // Object{constructor: Foo}
上例中,使用new来调用Foo(...)时,我们会构造一个新对象并把它绑定到Foo(...)调用中的this上
this四条规则的优先级:
new调用 > 显式调用 > 隐式调用 > 默认绑定