二次封装函数
2017-04-18 17:16
239 查看
题目描述
已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:
1、返回一个函数 result,该函数接受一个参数
2、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致
输入例子:
var sayIt = function(greeting, name, punctuation)
{
};
partial(sayIt, ‘Hello’, ‘Ellie’)(‘!!!’);
输出例子:
Hello, Ellie!!!
function partial(fn, str1, str2) {
var result=function(str3){
return fn(str1,str2,str3);
};
return result;}
var sayIt = function(greeting, name, punctuation) {
};
partial(sayIt, ‘Hello’, ‘Ellie’)(‘sb’);
partial(sayIt, ‘Hello’, ‘Ellie’)(‘!!!’);首先执行partial(sayIt, ‘Hello’, ‘Ellie’),将参数传入,然后返回函数result与(‘!!!’)组合成result(‘!!!’)执行。于是,可以在result函数里调用fn,因为函数的参数固定为三个,因此可以用call方法去调用函数fn。
// 一般写法
function partial(fn, str1, str2) {
function result(str3) {
return fn(str1, str2, str3);
}
}
// call
function partial(fn, str1, str2) {
function result(str3) {
return fn.call(this, str1, str2, str3);
}
}
// apply(这里只是为了对照)
function partial(fn, str1, str2) {
function result(str3) {
return fn.apply(this, [str1, str2, str3]);
}
}
// 这个bind会生成一个新函数对象, 它的str1, str2参数都定死了, str3未传入, 一旦传入就会执行
function partial(fn, str1, str2) {
return fn.bind(this, str1, str2); // 或 return fn.bind(null, str1, str2);
}
// bind同上, 多了一步, 把str3传入的过程写在另一个函数里面, 而另一个函数也有str1, str2参数
function partial(fn, str1, str2) {
function result(str3) {
return fn.bind(this, str1, str2)(str3);
}
}
bind不加后面的括号返回的是函数,加上后面的括号返回的是函数值,这也是bind和call和apply的主要区别,bind需要二次调用,而call和apply返回的是函数值,是直接调用。这道题让我更理解了三者的区别。
// 匿名函数
function partial(fn, str1, str2) {
return function(str3) {
return fn(str1, str2, str3);
}
}
// ES6
const partial = (fn, str1, str2) => str3 => fn(str1, str2, str3);
已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:
1、返回一个函数 result,该函数接受一个参数
2、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致
输入例子:
var sayIt = function(greeting, name, punctuation)
{
};
partial(sayIt, ‘Hello’, ‘Ellie’)(‘!!!’);
输出例子:
Hello, Ellie!!!
function partial(fn, str1, str2) {
var result=function(str3){
return fn(str1,str2,str3);
};
return result;}
var sayIt = function(greeting, name, punctuation) {
console.log(greeting + ', ' + name + (punctuation || '!')); return greeting + ', ' + name + (punctuation || '!');
};
partial(sayIt, ‘Hello’, ‘Ellie’)(‘sb’);
partial(sayIt, ‘Hello’, ‘Ellie’)(‘!!!’);首先执行partial(sayIt, ‘Hello’, ‘Ellie’),将参数传入,然后返回函数result与(‘!!!’)组合成result(‘!!!’)执行。于是,可以在result函数里调用fn,因为函数的参数固定为三个,因此可以用call方法去调用函数fn。
// 一般写法
function partial(fn, str1, str2) {
function result(str3) {
return fn(str1, str2, str3);
}
return result;
}
// call
function partial(fn, str1, str2) {
function result(str3) {
return fn.call(this, str1, str2, str3);
}
return result;
}
// apply(这里只是为了对照)
function partial(fn, str1, str2) {
function result(str3) {
return fn.apply(this, [str1, str2, str3]);
}
return result;
}
// 这个bind会生成一个新函数对象, 它的str1, str2参数都定死了, str3未传入, 一旦传入就会执行
function partial(fn, str1, str2) {
return fn.bind(this, str1, str2); // 或 return fn.bind(null, str1, str2);
}
// bind同上, 多了一步, 把str3传入的过程写在另一个函数里面, 而另一个函数也有str1, str2参数
function partial(fn, str1, str2) {
function result(str3) {
return fn.bind(this, str1, str2)(str3);
}
return result;
}
bind不加后面的括号返回的是函数,加上后面的括号返回的是函数值,这也是bind和call和apply的主要区别,bind需要二次调用,而call和apply返回的是函数值,是直接调用。这道题让我更理解了三者的区别。
// 匿名函数
function partial(fn, str1, str2) {
return function(str3) {
return fn(str1, str2, str3);
}
}
// ES6
const partial = (fn, str1, str2) => str3 => fn(str1, str2, str3);
相关文章推荐
- 二次封装函数
- 二次封装函数 arguments
- 二次封装函数
- mapgis6.7二次开发vc6_demo 之六(mapgis公用函数二次封装库)
- 二次封装函数
- mapgis6.7二次开发vc6_demo 之六(mapgis公用函数二次封装库)
- 基于32位和64位Libjpeg库的压缩和解压缩函数的封装
- php封装函数 thinkphp select查询语句只取出固定字段
- iOS简单封装网络请求,使用block回掉函数方式
- BP神经网络——从二次代价函数(Quadratic cost)到交叉熵(cross-entropy cost)代价函数
- OKHttp简单二次封装
- RichView的几个封装函数(插入文本和图片)
- js的一些函数封装
- xUtils3的二次封装使用
- Nordic 51822 函数封装技巧
- 二次封装的GCD使用
- AFN的简单二次封装
- 项目常见函数封装,基于Jquery
- PHP个人常用函数封装
- 事件封装(多个函数绑定一个事件,预计这样解释不正确)