apply() 的应用
写在前面的吐槽:头晕哦~每次跟 this
相关的知识点都是晕的一笔。本以为掌握了,但是看书发现大牛把 apply()
方法玩得太溜了,自己只得灰溜溜的总结一下,以期获得更深的理解和更高的提升。
基础知识
apply() 方法可以在使用一个指定的 this 值和一个参数数组(或类数组对象)的前提下调用某个函数或方法。也就是说:用于在特定的作用域中调用函数。实际上,等于设置函数体内 this
对象的值。简而言之:切换函数的作用域
注:该方法的作用和 call() 方法类似,只有一个区别就是,call() 方法接受的是若干个参数的列表,而 apply() 方法接受的是一个包含多个参数的数组(或类数组对象)。
语法
fun.apply(thisArg[, argsArray])
相当于:
thisArg.fun([argsArray])
-
第一个参数: 在其中运行函数的作用域,也就是设置 this 的值。
需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动指向全局对象(浏览器中就是 window 对象),同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。
-
第二个参数(可选): 参数数组,Array 的实例或者 arguments 对象。
其中的元素将作为单独的参数传给 fun 函数。如果该参数的值为 null 或 undefined,则表示不需要传入任何参数。
用法
基本用法
window.color = "red";
var o = {color: "blue"};
function sayColor() {
alert(this.color);
}
sayColor(); // red ==> window.sayColor()
sayColor.call(this); // red ==> window.sayColor()
sayColor.call(o); // blur ==> o.sayColor()
sayColor.call(window); // red ==> window.sayColor()
函数绑定
// 在 bind() 中创建了闭包,闭包使用 apply() 调用传入的函数
// 并给 apply() 传递context对象和参数。
// arguments 对象是内部函数的,而非 bind() 的
// 当调用返回的函数时,它会在给定环境中执行被传入的函数
// 并给出所有的参数
function bind(fn, context) {
return function () {
return fn.apply(context, arguments);
};
}
以上。