zoukankan      html  css  js  c++  java
  • this的指向问题(改变this指向)

    this的指向问题

    函数内的this指向

    这些this的指向,是当我们调用函数的时候确定的。调用方式的不同决定了this的指向不同

    一般指向我们的调用者.

    调用方式 this指向
    普通函数调用 window
    构造函数调用 实例对象、原型对象里面的方法也指向实例对象
    对象方法调用 该方法所属对象
    事件绑定方法 绑定事件对象
    定时器函数 window
    立即执行函数 window

    改变函数内部this指向

    1.call

    call可以调用函数,可以改变函数内的指向

    var o = {
    	name:'Andy'
    };
    function fn() {
    	console.log(this);  
    }
    fn(); //window
    fn.call(o); // {name:'Andy'}
    

    call的主要作用可以实现继承

    function Father(uname,age,sex) {
        this.uname = uname;
        this.age = age;
        this.sex = sex;
    }
    
    function Son(uname,age,sex) {
        Father.call(this,uname,age,sex); //继承父类构造函数里的属性 
    }
    var son = new Son('Andy',18,'女');
    console.log(son); //Son {uname: "Andy", age: 18, sex: "女"}
    

    2.apply

    调用函数,改变函数内部this的指向

     var o = {
     	name:'Andy'
     };
     function fn() {
     	console.log(this);
     }
     fn(); //window
     fn.apply(o); //{name:'Andy'}
    

    参数必须是数组(伪数组)

    var o = {
     	name:'Andy'
     };
     function fn(arr) {
     	console.log(this); //{name: "Andy"}
     	console.log(arr); // pink
     }
     fn.apply(o,['pink']); //{name:'Andy'}
    

    apply的主要应用,比如可以利用apply借助于数学内置对象求最大值

    var arr = [1,56,23,10];
    var res = Math.max.apply(Math,arr); //最好让函数指向函数的调用者
    console.log(res); //56
    

    3.bind

    bind不会调用原来的函数 可以改变原来函数内部this的指向

    fun.bind (thisArg, arg1, arg2, ...)
    
    • thisArg :在fun函数运行时指定的this值
    • arg1 , arg2 :传递的其他参数
    • 返回由指定的this值和初始化参数改造的原函数拷贝

    返回的是原函数改变this后的新函数

    var o = {
     	name:'Andy'
     };
    function fn() {
    	console.log(this);
    }
    var f = fn.bind(o);
    f();  //{name: "Andy"}
    
    

    如果有的函数不需要立即调用,但又想改变函数内部的this指向时,要用bind

    //有一个按钮,点击了之后禁用,3s之后恢复
    
    var btn = document.querySelector('button');
    /*btn.onclick = function () {
        this.disabled = true;  //这个this指向的时btn这个按钮
        setTimeout(function () {
        	this.disabled = false; // 定时器里的this 指向window
        },3000)
    }*/
    btn.onclick = function () {
        this.disabled = true;  //这个this指向的时btn这个按钮
        setTimeout(function () {
        	this.disabled = false; // 此时,定时器里的this指向btn
        }.bind(this),3000) //这个this指向的是btn这个对象
    }
    

    总结

    相同点:

    都可以改变函数内部的this指向.

    区别点:

    1. call 和apply会调用函数并且改变函数内部this指向.
    2. call 和apply传递的参数不一样, call传递参数arg1, arg2.形式apply必须数组形式[arg]
    3. bind 不会调用函数可以改变函数内部this指向.

    主要应用场景:

    1. call 经常做继承.
    2. apply经常 跟数组有关系比如借助于数学对象实现数组最大值最小值
    3. bind 不调用函数但是还想改变this指向,比如改变定时器内部的this指向.
  • 相关阅读:
    20210519日报
    20210518日报
    20210517日报
    20210514日报
    20210513日报
    20210512日报
    20210511日报
    数据挖掘提分三板斧-转
    特征变量和y值的可视化
    kaggle 2015年航班延误
  • 原文地址:https://www.cnblogs.com/wahaha-/p/14013515.html
Copyright © 2011-2022 走看看