this(普通函数)

this是什么

this———用于访问当前方法所属的对象

let obj = {
a: 12,
fn:function (){
console.log(this===obj)
}
}
obj.fn();

当前这个方法fn是属于obj,所以this就是obj,所以结果为true

这时用另一种写法

let obj = {
a: 12,
}
obj.fn = function (){
console.log(this===obj)
}
obj.fn();

这种后添的写法结果也是完全一样

this绑定方式

this和函数的定义无关,和函数的调用有关,也可以说同一个函数的this可以有很多种值,这取决于怎么调用这个函数

1.直接调用——window || undefined PS:在node环境里为global或者undefined

下面是直接调用函数

function show(){
console.log(this)
}
show()

结果为window,但这是个错误,因为show不属于任何对象,和this的定义有所冲突

在这里window相当于是一个兜底的角色,就是找不到this的时候,就用window来兜底

后面经过修改,如果加上了严格模式

'use strict'

则结果为undefined

2.挂载在对象上,然后执行方法,那this就指向对象

let arr=[1,2,3]
arr.fn=show
arr.fn()

此时输出的结果就是arr,因为此时show挂在了arr上面,属于对象arr,所以this输出的值就是arr

3.定时器——window

setTimeout(show,100)

在加了严格模式下输出结果仍为window

因为定时器本来就属于window,window来执行定时器,定时器来执行show,所以最终show是被window调用的

4.工具函数

使用call强制改变this的值 ps:apply

show.call(12)
show.call('sdjlfhkajhf')//这里要求变成个字符串
show.call(new Date())//这里要求变成个日期对象
show.call({a: 12})//这里要求变成个json

使用forEach

let arr=[1,2,3]
arr.forEach(function (item){
console.log(this,item)
})

这里的情况相当于第一种情况

函数并没有挂在arr上面,只是交给了forEach去调用

forEach实际上是

arr.forEach=function (cb){
for(let i=0;i<this.length;i++){
cb(this[i])//这里就是直接调用
}
}

但是forEach有第二个参数,这个参数就有绑定this的作用

let arr=[1,2,3]
arr.forEach(function (item){
console.log(this,item)
},this)

这里的用法就相当于是call的用法