this绑定和优先级

aminzi

this 指向的情况,调用的方式有关

与 this 所处的函数没多少关系,绑定和定义的位置(编写的位置)没有关系

函数在调用时,JavaScript 会默认给 this 绑定一个值

函数被调用方式有关,绑定调用方式以及调用的位置有关系

this 是在运行时被绑定的

开发中常常用在函数使用

  • 所有的函数在被调用时,都会创建一个执行上下文
  • 这个上下文中记录着函数的调用栈、AO 对象等
  • this 也是其中的一条记录

this 绑定的情况

  • 默认绑定
  • 隐式绑定
  • 显示绑定
  • new 绑定

一、默认绑定

什么情况下才默认绑定?

独立的函数中调用

1
2
3
4
5
function foo(){
console.log(this)
}

foo()
1
2
3
4
5
6
7
8
9
10
11
var obj = {
name: "why",
foo: function() {
console.log(this)
}
}

var bar = obj.foo
bar() // window

独立函数 bar()

闭包指向 window?

不一定

因为跟函数调用的方式有关

  • 全局才是指向 window
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 闭包
function foo() {
return function () {
console.log(this);
}
}

let fn = foo()
// fn() // 调用的位置 ,独立函数调用,window

let obj = {
name:'sss',
fun:fn
}

obj.fun() // 调用的位置, 指向对象 obj

二、隐式绑定

通过某个对象进行调用的

就是它的调用位置中,是通过某个对象发起的函数调用

谁调用它指向它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var obj1 = {
name: "obj1",
foo: function() {
console.log(this)
}
}

var obj2 = {
name: "obj2",
bar: obj1.foo
}

obj2.bar()
// this指向 obj2
// 谁调用它指向它

三、显示绑定

  • call
  • apply
  • bind

绑定的前提式一个函数

否则会报错

call/apply

js 中所有函数都有这个方法

call 和 apply 有什么区别?

第一个参数是相同的都是对象,后面的参数,call 为参数列表,apply 为数组

1
2
sum.call("call", 20, 30, 40)
sum.apply("apply", [20, 30, 40])

bind

返回一个函数,需要自己调用

四、new 绑定

  • 创建一个空对象
  • this 指向这个对象
  • 在对象身上添加属性
  • 返回这个对象

this 绑定的优先级

  • 显示绑定优先级 > 隐式绑定

  • new 绑定优先级 > 隐式绑定

  • new 绑定优先级 > bind

  • new 绑定和 call、apply 是不允许同时使用的,所以不存在谁的优先级更高

  • new 绑定可以和 bind 一起使用,new 绑定优先级更高

特殊的 this 指向

当 call/ apply/ bind 传入 null underfind,this 指向是 全局 window

1
2
3
4
5
6
7
function foo() {
console.log(this);
}

foo.call(null)
foo.apply(null)
foo.bind(null)()

箭头函数

没有 this

是通过作用域来访问上层的 this