zoukankan      html  css  js  c++  java
  • JS函数中this指向问题

    函数this的指向不是由函数定义时确定,而是在调用时才确定

        function test() {
            console.log(this);
        }
        test(); //window  '严格模式下为undefined'
        
        var obj = {
            id: 1,
            test: function () {
                console.log(this);
            }
        };
        obj.test(); //obj
        
        var fn = function () {
            console.log(this);
        };
        fn(); //window '严格模式下为undefined'
    

    1、定时器内部this指向window,事件处理函数的this指向发生事件的元素event.currentTarget

    var liArr = document.getElementsByTagName('li');
        for(var i=0; i<liArr.length; i++) {
            liArr[i].onclick = function () {
                console.log(this); // <li>i行</li> 指向事件发生的目标元素
                var that = this; //传统函数 将对应的目标元素存起来以便定时器内使用
                setTimeout(function () {
                    console.log(this); //window 
                    console.log(that); //<li>i行</li> 指向事件发生的目标元素
                },1000)
            }
        }
    

    2、 ES6标准箭头函数的this指向父执行上下文

    var liArr = document.getElementsByTagName('li');
        for(var i=0; i<liArr.length; i++) {
            liArr[i].onclick = function () {
                console.log(this); // <li>i行</li> 指向事件发生的目标元素
                setTimeout(() => {
                    console.log(this); //<li>i行</li> 指向事件发生的目标元素
                },1000)
            }
        }
    

    箭头函数内部没有自身的this,所以继承定义时外部的this,外部的this取决于执行时的指向,利用箭头函数,定时器可以直接内部使用this获取需要的this

    3、 绑定this指向的三种方式apply,call,bind

    apply

    func.apply(obj,[参数数组]); // 将func的this绑定到obj上,使obj也有func方法,并传入参数列表执行 会立即执行

    call

    func.call(obj,参数1,参数2,...,参数n); // 将func的this绑定到obj上,使obj也有func方法,并传入参数执行 会立即执行

    bind

    var func1 = func.bind(obj) 将func的this指向给obj,并返回该函数
    func1(参数1,参数2,...,参数n);

    function func(a,b,c) {
            var sum = a+b+c;
            console.log(this);
        }
    
        var obj = {
            id: 1
        };
        // apply
        func.apply(obj,[1,2,3]); //obj
        //call
        func.call(obj,1,2,3); //obj
        //bind
        var func1 = func.bind(obj);
        func1(1,2,3); //obj
  • 相关阅读:
    Java实现币值最大化问题
    Java实现币值最大化问题
    Java实现币值最大化问题
    Java实现币值最大化问题
    ddd
    雷军:小米最坏的时候已过去 2017目标营收千亿(确实有些新意)
    真正的转变从不确定中来
    很多人知道自己的斤两,他之所以抱怨工资低,不是觉得薪水和自己的能力不匹配,而是因为工资确实不够用(笑死了)
    CodeSmith
    sb2-admin
  • 原文地址:https://www.cnblogs.com/mengjingmei/p/9401808.html
Copyright © 2011-2022 走看看