this的理解
在一般的函数里面this他就指向全局对象 window 不管这个函数被包裹几层 他指向window
1.如果这个函数被绑定在一个对象里面那么这个this将会被隐式的指向这个对象 如果这个函数在进行嵌套一个函数的话 那么所嵌套的那个函数的this执行window
## this的脱离绑定
- 指一个区域块的this被保存(提升)在全局里面此时的this就指向全局了
-------------案例-------------------
var obj = {
a: 1, // a是定义在对象obj中的属性 1
fire: function () {
console.log(this.a)
}
}
var a = 2; // a是定义在全局环境中的变量 2
obj.fire(); //1 此时fire的指向时obj
var fireInGrobal = obj.fire; //因为fireInGrobal是全局变量,this对于obj的绑定丢失,绑定到了全局window
fireInGrobal(); // 输出 2 输出全局变量啊
//在这里因为obj里面的函数被保存在全局变量里面了 此时的this的指向也相对的提升了
改变this的执行的几种方法
1. call()
语法格式:
里面包含this需要更改指向的函数.call(被指向的对象,实参1,实参2,....)
例如:
2. apply()
语法格式:
里面包含this需要更改指向的函数.apply(被指向的对象,[参数1,参数2.。。])
//apply()和call()十分相似 只是传参的形式是数组
3. bind()
语法格式:
里面包含this需要更改指向的函数.bind(被指向的对象,参数1,参数2.。。) ()
// bind() 改变了this的指向 根据需求后面要在加()调用一下这个函数 如不加()则是只改变指向 没有调用
解决this的作用域问题
- 通常我们在子函数里面想要使用外层函数的this但这个this总是指向window 此时我们可以将this储存在一个变量里面来进行调用就解决了