javascript - call的疑问

查看:93
本文介绍了javascript - call的疑问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

《JavaScript权威指南》上有一段用来实现Array.prototype.map的函数:

var map = function(a,f){
    var results = [];
    for(var i = 0,l = a.length; i<l; i++){
        if(i in a){
            results[i] = f.call(null,a[i],i,a);//这里
        }
    }
    return results;
};

为什么要用call(null)而不是直接使用f(a[i], i, a)? 这样this都是指向全局啊

解决方案

你可以看到,在这里实现的map是这种形式的, 即 map(array, f),也就是只能用两个参数来调用,
我们再看一下MDN上给出的函数原型,

const new_array = arr.map(callback[, thisArg])

callback也就是我们所说的f,那么最后一个this是可选的,而书上提供的函数根本就没有考虑这个值,那么当不传这个值的时候,如果省略了 thisArg 参数,或者赋值为 null 或 undefined,则 this 指向全局对象 。
此外,我们已知在使用函数对象call方法时,

如果这个函数处于非严格模式下,则指定为null和undefined的this值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。

总之,一句话为了完全模拟map函数的性质~

这篇关于javascript - call的疑问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆