详解apply的用途

先谈this

关于this的指向就不细说了,网上有无数博客以及you don’t kown js这类书讲的已很详细了这里就不炒冷饭了。
举几个简朴的例子
function foo() {
    console.log(this);
}
    
foo() //window

var obj = {
    job: 'doctor',
    show: function() {
        console.log(this.job); //job
        console.log(this === obj); //true
    }
}
obj.show();

apply的用途

革新一下上面的例子
var obj = {
    job: 'doctor',
}
function foo(str) {
    console.log(this); //obj
    console.log(str);  //hi
}
foo.apply(obj,['hi']);
挪用一个函数的要领有许多能够用函数表达式挪用,也能够直接挪用。另有一种要领是用apply挪用
apply接收两个参数,第一个参数是函数运行时指向的this,第二个参数是一个数组内里寄存函数的参数。
也就是我们能够手动变动this的指向,再次看上面的代码我们让函数foo中的this指向了obj,还接收了一个字符串’hi’
那末反过来我们是不是能够在foo中对obj的属性举行赋值呢?答案是一定的
再次变动代码
var obj = {
    job: 'doctor',
}
function foo(str) {
    this.books = ['One Hundred Years of Solitude', 'Gone with the wind']
}
foo.apply(obj,['hi']);
console.log(obj); // {job: "doctor", books: Array(2)}
apply的用途无所不在,比方将nodelist转为数组,范例检测这些网上一样有许多例子

apply与函数式编程

假如我们有声明一个数组并想得到数组中每个元素的值我们能够这么做
var arr = ['katana', 'chunks', 'shurken'];
for(var i = 0;i<arr.length; i++) { //直接在轮回写arr.length并非一个好习惯
    console.log(arr[i])
}
然则这类声明式的写法是不是是有些貌寝?让我们换一种写法
function forEach(list, callback) {
    for(var n = 0; n<list.length; n++) {
        callback.call(list[n], n, list[n]);
    }
}
var arr = ['katana', 'chunks', 'shurken'];
forEach(arr, function(index, value) {
    console.log(index);
    console.log(value)
})
    原文作者:越过山丘
    原文地址: https://segmentfault.com/a/1190000013841727
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞