这是我参与更文挑战的第4天,活动详情查看:更文挑战
this
this是 JavaScript 语言的一个关键字。
它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。当一个函数被调用时,会创建一个活动记录(上下文)。这个记录会包含函数在哪被调用(调用栈)、函数的调用方式、传入的参数等信息。this在函数执行过程中用到,它与绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。
this绑定规则
默认绑定
独立的函数调用,无法使用其他规则时的默认规则
function foo() {
log(this.a)
}
var a = 2
foo() // window
隐式绑定
调用的位置 是否有上下文
function foo() {
log(this.a)
}
var obj = {
a: 2,
foo: foo
}
obj.foo() // obj
当函数引用有上下文时,隐式绑定规则会把函数调用中的this绑定到这个上下文对象,或者是说,对象属性引用链中只有最后一层在调用位置起作用
显示绑定
function foo () {
log(this.a)
}
var obj = {
a: 2
}
foo.call(obj) // obj
new绑定
使用 new来构造foo(...)时,会构造一个新对象并把它绑定到foo(...)调用中的this
function foo(a) {
this.a = a
}
var bar = new foo(2)
log(bar.a) // bar
优先级
new绑定 > 显示绑定 > 隐式绑定
new操作执行的四个步骤
- 构建一个全新的对象
- 这个新对象会被执行[[prototype]]连接
- 这个新对象会绑定到函数调用的this
- 如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象
apply、bind、call区别
// 调用区别
// apply可传入除this指向外,仅支持传入一个参数,直接运行调用者
Function.apply(obj[, argArray])
// bind 方法的返回值是函数,并且需要执行调用,才会执行。而 apply 和 call 则是立即调用。
Function.bind(thisArg[, arg1[, arg2[, ...]]])
// call可传入除this指向外,多个参数,直接运行调用者
Function.call(obj[, param1[, param2[, …[, paramN]]]])