this
function foo() {
console.log(this.a) }
var a = 1
foo()
const obj = {
a: 2,
foo: foo
}
obj.foo()
const c = new foo()
对于直接调用 foo 来说,不管foo函数被放在什么位置,this 一定是 window;
对于 obj.foo() 来说,谁调用了函数,谁就是this,所以在这个场景下 foo函数中的this就是obj对象;
对于new 的方式来说,this就永远绑定在了c上面,不会被任何方式改变this;
箭头函数中的this:
function a() {
return () => {
return () => {
console.log(this)
}
}
}
console.log(a()()())
首先箭头函数是没有this的,箭头函数中的this只取决包裹箭头函数的第一个普通函数的this。
在这里,因为包裹箭头函数的第一个普通函数是a,所以此时的this是window。另外对箭头函数使用bind这类函数是无效的。
最后一种情况也就是 bind 这些改变上下文的API了,对于这些函数来说,this取决于第一个参数,如果第一个参数为空,那么就是window。
let a = {}
let fn = function () { console.log(this) }
fn.bind().bind(a)() // => ?
// fn.bind().bind(a) 等于
let fn2 = function fn1() {
return function() {
return fn.apply()
}.apply(a) }
fn2()
不管我们给函数 bind ⼏次, fn 中的 this 永远由第⼀次 bind 决定,所以结果永远是 window。
let a = { name: 'poetries' }
function foo() {
console.log(this.name) }
foo.bind(a)() // => 'poetries'
⾸先, new 的⽅式优先级最⾼,接下来是 bind 这些函数,然后是
obj.foo() 这种调⽤⽅式,最后是 foo 这种调⽤⽅式,同时,箭头函数的
this ⼀旦被绑定,就不会再被任何⽅式所改变。