前言
提示:这里可以添加本文要记录的大概内容:
在javaSrcipt中也经常会用到this关键字,但是仅局限于用它,如果要求讲明白this到底是什么的话可能就有点懵逼了。这玩意this是神马东东!!
提示:以下是本篇文章正文内容,下面案例可供参考
一、this是什么?
- this实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。
- this永远指向一个对象
function fn() {
console.log(this.A);
}
var obj = {
A: '1',
F: fn
}
var A = '2'
obj.F() //1
fn() //2
在此呢,fn 被调用了俩次,明显俩次结果是不一样的;
二、this的指向
1.在全局环境下的this指向window
console.log(this); // window
2.被嵌套的函数独立调用时,this指向window
代码如下(示例):
let obj = {
a: 2,
say: function () {
function test() {
console.log(this); // window
}
test();
}
}
obj.say()
3.IIFE自执行函数
代码如下(示例):
+function fn(){
console.log(this); //window
}()
三、this隐式绑定
1.当函数当作方法时候使用,this指向直接对象
function fn() {
console.log(this); //say
}
let obj = {
fn: fn,
say: {
A: 1,
fn: fn
}
}
obj.say.fn() //{A: 1, fn: ƒ}
function fn() {
console.log(this.name); //obj
}
let obj = {
name: 'zs',
say: fn
}
let str = obj.say() //zs
四、this隐式丢失
1.被隐式绑定的函数丢失了绑定对象,从而默认绑定到window
function fn() {
console.log(this); //window
}
let obj = {
name: 'zs',
say: fn
}
let str = obj.say
str() //在这执行了方法
2.setTimeout() 和 setInterval() 第一个参数的回调函数中的this 默认指向window
setTimeout(function () {
console.log(this); //window
}, 0)
五.显示绑定
1.call().apply方法
function fn() {
console.log(this.age)
}
let info= {
age: 20
}
fn.call(info)//20
fn.apply(info)//20
call和apply,这两个函数的第一个参数,都可以改变执行函数绑定的this,对于call可以跟很多参数,之后的参数单个起都会被传入到要执行函数的参数中,而apply只有俩个参数,第二个参数是一个数组,这个数组是要传入执行函数的参数,
3.bind()
let obj = {
name: 'zs'
}
function foo() {
console.log(this); // obj
}
let fn = foo.bind(obj);
fn()
4.new绑定
new关键字来执行函数,相当于构造函数来实例化对象,则this指向当前实例化的对象
function Fn(){
console.log(this); //Fn {}
}
let A=new Fn()
总结
提示:这里对文章进行总结:
this的优先级:new绑定 > 显示绑定 > 隐式绑定 > 默认绑定
在js中,一切皆为对象,运行环境也是对象,所以函数都是在某个对象下运行,而this就是函数运行时所在的对象(环境)。这本来并不会让我们糊涂,但是JavaScript支持运行环境动态切换,也就是说,this的指向是动态的,很难事先确定到底指向哪个对象,这才是最让我们感到困惑的地方。