function callIt(fn) { var arr = []; for(var i = 1;i<arguments.length;i++) { arr.push(arguments[i]); } return fn.apply(callIt,arr); }
// FED42使用apply调用函数 // 描述 // 实现函数 callIt,调用之后满足如下条件 // 1、返回的结果为调用 fn 之后的结果 // 2、fn 的调用参数为 callIt 的第一个参数之后的全部参数 // 示例1 // 输入: // 无 // 输出: // 无 function callIt(fn) { // 方法1 使用arguments,利用...拓展将其变为数组 let args = [...arguments]; return args[0].apply(this, args.slice(1)); // // 另一种实现 // let args = [...arguments]; // let f = args[0]; // args.shift(); // return f.apply(this, args); // // 方法2 用Array.prototype.slice.call将参数arguments转为数组,并去掉第一个元素 // let args = Array.prototype.slice.call(arguments, 1); // return fn.apply(null, args); // // 另一种实现,用空数组调用.slice.call方法 // let args = [].slice.call(arguments, 1); // return fn.apply(null, args); }
function callIt(fn) { var ary = [].slice.call(arguments,1) return fn.apply(null,ary) }
function callIt(fn) { [].shift.call(arguments) var ary = [].slice.call(arguments) return fn.apply(null,ary) }
function callIt(fn) { return fn.apply(null, Array.prototype.slice.call(arguments, 1)); } function callIt(fn) { return fn.apply(null, [].slice.call(arguments, 1)); }
首先介绍 apply 模式,首先这里 apply 模式既可以像函数一样使用,也可以像方法一样使用,可以说是一个灵活的使用方法。首先看看语法:函数名.apply(对象, 参数数组);
这里看语法比较晦涩,还是使用案例来说明:
1、新建两个 js 文件,分别为”js1.js”与”js2.js”;
2、添加代码
// js2.js 文件
var func2 = function() {
this.name =
"程序员";
};
var o = {};
func2.apply(o);
alert(o.name);
3、分别运行着两段代码,可以发现第一个文件中的 name 属性已经加载到全局对象 window 中; 而第二个文件中的 name 属性是在传入的对象 o 中,即第一个相当于函数调用,第二个相当 于方法调用。
这里的参数是方法本身所带的参数,但是需要用数组的形式存储在,比如代码:
// 定义方法
var func = function(name, age, sex) {
this.name = name;
this.age = age;
this.sex =
sex;
};
// 创建对象
var o = {};
// 给对象添加成员
//
apply 模式
var p1 = func.apply(o, ["赵晓虎", 19,
"男"]);
// call 模式
var p2 = func.call(o,
"赵晓虎", 19, "男");
上面的代码,apply 模式与 call 模式的结果是一样的。
实际上,使用 apply 模式和 call 模式,可以任意的操作控制 this 的意义,在函数 js 的设 计模式中使用广泛。简单小结一下,js 中的函数调用有四种模式,分别是:函数式、方法式、构造 器式和 apply 式. 而这些模式中,this 的含义分别为:在函数中 this 是全局对象 window,在方 法中 this 指当前对象,在构造函数中 this 是被创建的对象,在 apply 模式中 this 可以随意的指定.。在 apply 模式中如果使用 null,就是函数模式,如果使用对象,就是方法模式。