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,就是函数模式,如果使用对象,就是方法模式。
function callIt(fn) { //将arguments转化为数组后,截取第一个元素之后的所有元素 var args = Array.prototype.slice.call(arguments,1); //调用fn var result = fn.apply(null,args); return result; }