this指向

1.this

在每一个函数中,都有一个内置的变量 this。大部分情况下,这个this存储是当前函数的调用者。this的指向在函数定义的时候是确定不了的。只有函数执行的时候才能确定this到底指向谁。

function fn(){
    console.log(this)
}
fn() //window
obj.fn // obj

2.几种情况

1.全局变量中指向window

function show(){
	console.log(this);//window
}
show()

2.在对象的方法中指向调用者

    var o = {
        a: 10,
        b: {
            a: 12,
            fn: function() {
                console.log(this.a); //12
                console.log(this); //b
            }
        }
    }
    o.b.fn();
    var o = {
        a: 10,
        b: {
            a: 12,
            fn: function() {
                console.log(this.a); //undefined
                console.log(this); //window
            }
        }
    }
    var j = o.b.fn;
    window.j();

3.在事件绑定中,指向目标对象

    var box = document.getElementById("box");
    box.onclick = function() {
        console.log(this);
    }

4.定时器处理函数中,指向window

    var o = {
        a: 10,
        b: {
            a: 12,
            fn: function() {
                console.log(this.a); //undefined
                console.log(this); //window
            }
        }
    }

    setTimeout(o.b.fn, 0)
    setInterval(o.b.fn, 1000)

3.强行改变this指向

3.1 call()

格式:

函数名.call(obj,arg...);
//obj : 函数内部的this指向
//arg...:从第二个参数开始,为函数的参数。

特点:

立即执行当前函数。

【注意】定时器处理函数或者事件处理函数

    function fn(x, y) {
        console.log(x + y);
    }
    var a = 12;
    var obj = {
            a: 10
        }
        // fn()
    fn.call(obj, 10, 20); //30
    var obj = {
        a: 10
    }

    function fn() {
        console.log("我是延时函数");
    }
    setTimeout(fn.call(obj), 3000); //我是延时函数

3.2 apply()

格式:

//obj : 函数内部的this指向
//arr:一个数组或者伪数组,里面的每一个元素会依次传递给函数。
函数名.apply(obj,arr);

特点:

立即执行当前函数。

【注意】定时器处理函数或者事件处理函数

    function fn(x, y) {
        console.log(x + y); //30
        console.log(this); //{}
    }
    var obj = {

        }
        // fn(10, 20) //30  window
    fn.apply(obj, [10, 20]);

**应用:**可以以数组的形式给某些功能函数传参。

var arr = [10,5,30,-15,6,40]
// var max = Math.max(10,5,30,-15,6,40);
var max = Math.max.apply(null,arr);
console.log(max); //40

3.3 bind()

格式:

//obj : 函数内部的this指向
//arg:从第二个参数开始,依次为函数传递参数。
函数名.bind(obj,...arg);

特点

不会立即执行函数,会返回一个新的函数,该函数内部的this指向为传入的对象。

    function fn(x,y){
        console.log(x+y);
        console.log(this);
    }
    var obj ={

    }
    fn(10,20)  //30  window
    var res = fn.bind(obj,10,20);
    res();   //30  {}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值