高阶函数分分快三计划

作者:分分快三计划

对于很多初学者,this总是搞得我们晕头转向。

原理

  • map方法会给原数组中的每个元素都按顺序调用一次 callback
    函数。callback
    每次执行后的返回值(包括 undefined )组合起来形成一个新数组。 callback
    函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete
    删除的索引则不会被调用。

  • callback函数会被自动传入三个参数:数组元素,元素索引,原数组本身。
    如果 thisArg参数有值,则每次 callback函数被调用的时候,this都会指向 thisArg参数上的这个对象。如果省略了 thisArg 参数,或者赋值为 null或 undefined,则 this 指向全局对象 。

  • map不修改调用它的原数组本身(当然可以在 callback
    执行时改变原数组)。
    使用 map 方法处理数组时,数组元素的范围是在 callback 方法第一次调用之前就已经确定了。在 map 方法执行的过程中:原数组中新增加的元素将不会被 callback 访问到;若已经存在的元素被改变或删除了,则它们的传递到 callback 的值是 map 方法遍历到它们的那一时刻的值;而被删除的元素将不会被访问到。

var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
// roots的值为[1, 2, 3], numbers的值仍为[1, 4, 9]

this在函数定义时经常是不能确定的,只有在函数执行的时候才能最终确定this的归属。this总是指向最后调用它的对象,那么怎么知道到底是谁调用的呢?其实很简单,我们知道函数调用的其中一种方法就是利用call.下面就来简单的分析一下怎么利用call来判断调用函数的对象到底是何方神圣。

原理
obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);

两者作用一致,都是把obj(即this)绑定到thisObj,这时候thisObj具备了obj的属性和方法。或者说thisObj『继承』了obj的属性和方法。唯一区别是apply接受的是数组参数,call接受的是连续参数。

function add(j, k){
    return j k;
}

function sub(j, k){
    return j-k;
}

我们在控制台运行:

add(5,3); //8
add.call(sub, 5, 3); //8
add.apply(sub, [5, 3]); //8

sub(5, 3); //2
sub.call(add, 5, 3); //2
sub.apply(add, [5, 3]); //2

通过call和apply,我们可以实现对象继承。示例:

var Parent = function(){
    this.name = "yjc";
    this.age = 22;
}

var child = {};

console.log(child);//Object {} ,空对象

Parent.call(child);

console.log(child); //Object {name: "yjc", age: 22}

以上实现了对象的继承。
在这里推荐一篇文章[深入学习JavaScript: apply 方法]

现在,我就简单的总结一下关于this的那点事。

callback

生成新数组元素的函数,使用三个参数:

  • currentValue
    callback 的第一个参数,数组中正在处理的当前元素。
  • index
    callback 的第二个参数,数组中正在处理的当前元素的索引。
  • array
    callback 的第三个参数,map 方法被调用的数组。

例子1:

thisArg

可选的。执行 callback 函数时 使用的this 值。

  test() 等价于 test.call(undefined) ,这时的thisArg为undefined,所以this指向全局对象(浏览器中为window对象),所以this.name为undefined。

语法

var new_array = arr.filter(callback[, thisArg])

  thisArg:fun函数运行时指定的this需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为nullundefinedthis值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。

map()

map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果.

 

thisArg

可选。执行 callback 时的用于 this 的值。

  第8行 test1=obj.func(),赋值时执行函数,obj.func()等价于obj.func.call(obj),thisArg为obj,this指向obj,this.name为tang;

参数

  第8行和第9行的区别在于赋值的时候有没有运行函数,第8行赋值的就运行函数,所以this指向obj,而第9行赋值时没有运行函数,只是把函数赋值给test2,所以this的指向还得等调用函数时才能确定,在第11行调用函数时才能确定。

参数

  第11行test2()等价于test2.call(undefined),所以this指向全局对象(浏览器中是window);

Apply()

apply()方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数。

知道了call的用法,就可以开始this的分析之旅了。

reduce()

对数组中的所有元素调用指定的回调函数。该回调函数的返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供。

先来看看call是怎么来使用的:

高阶函数分分快三计划。参数
  • thisArg
    fun 函数运行时指定的 this值。需要注意的是,指定的 this值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null或 undefined时会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this会指向该原始值的自动包装对象。
  • argsArray
    一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 fun函数。如果该参数的值为null或 undefined,则表示不需要传入任何参数。
 1 var obj = {
 2     name: 'tang',
 3     func: function () {
 4         var name = 'func';
 5         console.log(this.name);
 6     }
 7 };
 8 var test1 = obj.func();//tang
 9 var test2 = obj.func;
10 obj.func(); //tang
11 test2(); //undefined

语法

fun.apply(thisArg, [argsArray])
function test() {
    var name = 'test';
    console.log(this.name); //undefined
}
test();

filter()

filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。

 例子2:

原理

为数组中的每个元素调用一次 callback函数,并利用所有使得 callback 返回 true 或 (等价于 true 的值)的元素创建一个新数组。callback只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback测试的元素会被跳过,不会被包含在新数组中

var filtered = [12, 5, 8, 130, 44].filter(item => item >= 10);
// filtered is [12, 130, 44]
fun.call(thisArg, arg1, arg2, ...)

语法

array1.reduce(callbackfn[, initialValue])

  第10行obj.func() 等价于 obj.func.call(obj) ,这时的thisArg为obj,即this指向obj,所以this.name即为tang;

callback

用来测试数组的每个元素的函数。调用时使用参数 (element, index, array)。
返回true表示保留该元素(通过测试),false则不保留。

  arg1, arg2, ...:指定的参数列表。

高阶函数分分快三计划。语法

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

参数

参数 定义
array1 必需。一个数组对象。
callbackfn 必需。一个接受最多四个参数的函数。对于数组中的每个元素,reduce 方法都会调用 callbackfn 函数一次。
initialValue 可选。如果指定 initialValue,则它将用作初始值来启动累积。第一次调用 callbackfn 函数会将此值作为参数而非数组值提供。

案例:来自github上面的练习题[高阶函数分分快三计划。collection-calculate-camp]

'use strict';
var compute_average = require('../../practices/reduce/compute_average.js');

describe('compute_average', function () {

  var collection = [1, 3, 5, 98, 67, 453];

  iit('计算给定数字集合元素的平均值', function () {

    var result = compute_average(collection);
    expect(result).toEqual(104.5)
  });
});

'use strict';

function compute_average(collection) {

  return collection.reduce((a, b) => a   b)/collection.length;
}

module.exports = compute_average;

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划 Java学习笔 全栈工程师