内置函数提供的显式绑定

最近在开发中遇到使用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 = {
    val: 1,
    fun: func
};
function func(a) {
    return 2 * a;
}
let arr = [1, 2, 3];
let new_arr = arr.map(obj.fun); // no problem [2, 4, 6]

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

'use strict'
let obj = {
    val: 1,
    val2: 2,
    fun: func,
};
function func(a) {
    return 2 * (a + this.val2);
}
let arr = [1, 2, 3];
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]

javascript内置函数提供的显式绑定的更多相关文章

  1. 深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两种同步方式.显式锁是JDK1.5引入的,这两种锁有什么异同呢? ...

  2. JavaScript 内置函数有什么?

    javaScript内置函数 1.Date:日期函数 属性:constructor 所修立对象的函数参考prototype 能够为对象加进的属性和方法 方法:getDay() 返回一周中的第几天(0- ...

  3. 关于gcc内置函数和c隐式函数声明的认识以及一些推测

    最近在看APUE,不愧是经典,看一点就收获一点.但是感觉有些东西还是没说清楚,需要自己动手验证一下,结果发现需要用gcc,就了解一下. 有时候,你在代码里面引用了一个函数但是没有包含相关的头文件,这个 ...

  4. Kettle中JavaScript内置函数说明

    本文链接:https://blog.csdn.net/u010192145/article/details/102220563 我们在使用JavaScript组件的时候,在左侧核心树对象栏中可以看到K ...

  5. javascript内置函数

    1.Date:日期函数属性(1):constructor 所修立对象的函数参考prototype 能够为对象加进的属性和方法办法(43):getDay() 返回一周中的第几天(0-6)getYear( ...

  6. python高级内置函数和各种推导式的介绍:一行搞定的代码

    一.知识要点 all 都为真 any 有真的 min 最小的 max 最大的 sum 求和 reversed 反转 sorted 排序 zip 对应合并 [] 列表推倒式 () 生成器 {} 字典推倒 ...

  7. javascript内置函数:toString()

    不同对象有不同的实现方式. 1.Number对象: 语法:numberObject.toString([radix]) 参数:radix,可选/Number类型,指定的基数(进制数),支持[2,36] ...

  8. 拓展javascript内置函数

    1.获取字符串字节数 //获取字符串字节数 //方法一 /* */ String.prototype.getBytesLength = function () { var length = 0; fo ...

  9. JavaScript原生函数(内置函数)

    1.JavaScript原生函数(内置函数) JavaScript原生函数(内置函数)有: String() Number() Boolean() Array() Object() Function( ...

随机推荐

  1. Docker & k8s 系列二:本机k8s环境搭建

    本篇将会讲解k8s是什么?本机k8s环境搭建,部署一个pod并演示几个kubectl命令,k8s dashboard安装. k8s是什么 k8s是kubernetes的简写,它是一个全新的基于容器技术 ...

  2. chosen.jquery.min.js select2.js 弊端

    chosen.jquery.min.js --将select放在页面最下方,会导致页面高度增加,最下方空白多出来 select2.js --点击select 但未选择,然后移出鼠标,发现其他文本框.关 ...

  3. python—day03_函数

    1,参数 普通参数 # ######### 定义函数 ######### # name 叫做函数func的形式参数,简称:形参 def func(name): print(name) # ###### ...

  4. poj1780欧拉回路

    转载 #include<cstdio> #include<cstring> ; bool vis[N]; char ans[N]; int main() { int n; wh ...

  5. BZOJ 1028 BZOJ 1029 //贪心

    1028: [JSOI2007]麻将 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2197  Solved: 989[Submit][Status][ ...

  6. 朱刘算法 有向图定根的最小生成树poj3164

    关于为什么不能用Prim求解此类问题,如下 Prim可以看成是维护两个顶点集或者看成维护一颗不断生成的树(感觉前一种说法好一点) 倘若是有向图有三个顶点1.2.3 边的情况如下 1->2:    ...

  7. Pyqt5_QComboBox

    QComboBox 是一个集按钮和下拉选项于一体的控件,也称做下拉列表框 方法 addItem() 添加一个下拉选项 addItems() 从列表中添加下拉选项 Clear() 删除下拉选项集合中的所 ...

  8. 进程间的通信——pipe通信

    当进程创建管道文件后,其建立的子进程自动继承该文件. 管道通信分为命名管道和未命名管道,他们的区别是命名管道在当创建他的进程结束后,系统仍存有该文件 管道的命令格式为 pipe(fds) 其中 fds ...

  9. Siemens PLC分类和基本性能指标

    PLC分类 整体式plc也成为单元式,特点是电源,中央处理器单元以及I/O借口都集成在一个机壳内. 标准摸板试结构化,也成为组合式,特点是电源,中央处理器单元模板以及I/O模板在结构上都是相互独立的, ...

  10. layui 数据表格使用

    //第一个实例 table.render({ elem: '#demo' ,height: 400 ,url: '/My_NewsTest/LookServlet' //数据接口 ,page: tru ...