深刻浅出JavaScript之call()、apply()方法

写在前面:

隔了很长时间了,也不知道写点什么。最近一直在研究ES6,一直想写出来的文章能对初学者或者是在学习JS路上有所帮助的。这就是个人初衷。前端

call、apply的做用

在JavaScript中,call()方法和apply()方法都是为了改变函数运行时上下文而存在的,换句话说:就是为了改变函数体内部 this 的指向。
在JavaScript中,也能够说再OOP JavaScript思想编程中,其实最绕的地方就是:函数被定义时的上下文、运行时的上下文、上下文的改变。编程

咱们先来定义一个构造函数(constructor)而后改变指向:数组

function Fn() {}

Fn.prototype = {
    color:'red',
    say:function () {
        alert(this.color);
    }
};

var fn = new Fn();
fn.say();       //返回red

这是一个很普通的构造函数,给原型new了一个新的对象,而后添加一个属性和方法。那么咱们若是要再建立一个对象呢,不想给这个新的对象添加方法怎么去公用上面这个方法呢?app

var Fn1 = {
    color:'yellow'
};

var fn = new Fn();
fn.say.call(Fn1);    //使用call()方法返回yellow
fn.say.apply(Fn1);   //使用apply()方法返回yellow

因此,能够看出 call()和 apply()是为了动态改变 this 而出现的,当一个对象(Object)没有这个方法,可是其余的Fn原型里面有这个方法,咱们能够借助call或apply用其它对象的方法来操做。
你们是否是感受这个call()和apply()没什么差距对吧?函数

call()方法与apply()方法的差异

对于使用者而言,call与apply的做用彻底同样,不过它们接受的参数不同:
call()方法中的其他的参数必须直接传给函数
apply()接收两个参数:一个参数是在其中运行的做用域,另外一个是参数数组(能够是Array实例,也能够是arguments对象).
也能够理解为其实call传参为固定的必须知道你有多少个参数传进去,而apply能够传一个数组。学习

当明确知道传参数量时使用call()而不肯定的时候使用apply()方法而后把参数push进数组传递进去,函数内部也能够经过 arguments 这个数组来遍历全部的参数。this

深刻理解call与apply

function box(msg) {
    alert(msg);
}
box(1); //1
box(1,2); //1

上面的这个函数就是没有肯定实参数量,这个时候就能够考虑使用call或者apply,刚刚讲过,只有apply在不肯定的数量的时候使用最佳。prototype

function box(){
 console.log.apply(console,arguments);
};
box(1); //1
box(1,2); //1 2

这一章差很少就讲完了,其实要点没多少知识点,主要就是充分掌握了技巧与思想,JavaScript就会变的很容易。欢迎前端大牛纠正错误,若有错误我会及时改正。谢谢~code

(PS:其实一直不知道写什么,因此这么长时间没更新,若是你们想看JS哪些方面的,在我了解与掌握的前提下仍是能够写一写的。个人邮箱:cn_brian@163.com)对象

相关文章
相关标签/搜索