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
  • 相关阅读:
    Linux GCC常用命令
    用两个栈实现一个队列(转载)
    BMP格式介绍(一)
    图像处理笔记(1): bmp文件结构处理与显示
    大数据竞赛平台——Kaggle 入门篇
    图像识别中的深度学习
    面向对象中的抽象和具体类的理解
    全排列算法
    少有程序员读的书
    照片回执
  • 原文地址:https://www.cnblogs.com/mengjingmei/p/9401808.html
Copyright © 2011-2022 走看看