zoukankan      html  css  js  c++  java
  • javascript内置函数提供的显式绑定

    内置函数提供的显式绑定

    最近在开发中遇到使用arr.map(module.fun) 这样的写法时(在一个模块调用了另外一个模块的方法), 造成了函数中this丢失的问题, 显示为undefined, 因此去查阅一番资料,发现了一个不常用到的知识点: javascript内置函数提供的显式绑定

    拿Array.prototype.map()举个栗子

    注意提供的第二个参数 thisArg

    let new_array = arr.map(function callback( currentValue[, index[, array]]{
        // return element for new_array
    }[, thisArg]);

    假如你用来map的函数是一个纯函数(不包含this),那么你不显式地为该函数指定this, 也不会出啥问题

    let obj = {
        val1,
        fun: func
    };
    function func(a{
        return 2 * a;
    }
    let arr = [123];
    let new_arr = arr.map(obj.fun); // no problem [2, 4, 6]

    一旦你map的函数里包含了this, 那么你最好显式地给它指定正确的this, 否则会出现你意想不到的情况

    'use strict'
    let obj = {
        val1,
        val22,
        fun: func,
    };
    function func(a{
        return 2 * (a + this.val2);
    }
    let arr = [123];
    let new_arr = arr.map(obj.fun); // Uncaught TypeError: Cannot read property 'val2' of undefined
    // 非严格模式应该会绑定到window上 map后的结果是[NaN, NaN, NaN]

    let true_arr = arr.map(obj.fun, obj); // 第二个参数为函数指定了this map后的结果是我们想要的[6, 8, 10]

    // 当然下面这种写法也没有问题, 原理是this的显式绑定
    let true_arr2 = arr.map(function (item{
        return obj.fun(item); // fun被obj调用, 因此函数里的this被绑定到obj
    });
    // [6, 8, 10]
  • 相关阅读:
    scala02
    5.主从复制
    4.mysql锁机制
    3mysql查询截取分析
    2.2mysql 索引优化
    2.1mysql索引优化分析
    1.mysql 架构介绍命令,配置文件,架构,存储引擎,
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
    Glide使用
    网络通信框架Retrofit2
  • 原文地址:https://www.cnblogs.com/rencoo/p/13056099.html
Copyright © 2011-2022 走看看