假设您有一个功能,您可以输入一个“嘿”的警报,并且您希望允许它发生给定次数 - 例如2或3,或任何您想要的 - 然后在给定的数字警报之后负数或“不再”类型字符串的次数相同。
所以你希望你的函数多次调用
var hey = funky(function(){alert("hey")},3);
hey();
你是怎么做到的?
答案 0 :(得分:5)
funky
需要是一个“高阶”函数,它将您的输入函数“转换”为仅运行前n
次的函数:
function funky(fn, n) {
return function() {
return n-- > 0 ? fn.apply(this, arguments) : "No more";
};
}
在这里,我们使用fn.apply
允许用户通过this
和参数返回到返回的函数,因此您可以执行以下操作:
var hey = funky(function(name){ alert("hey " + name); }, 3);
hey("Bob"); // alert("hey Bob")
hey("Joe"); // alert("hey Joe")
hey("Sam"); // alert("hey Sam")
hey("Don"); // no alert, returns "No more"
将参数传递给派生函数是有用的,但在什么情况下它会尊重this
?显然只有涉及对象及其方法。考虑:
// Constructor to create new MyAlerter object, with magic number
var MyAlerter = function(magic) {
this.magic = magic;
}
// Method on MyAlerter to put up alert with magic number
MyAlerter.prototype.alert = function(name) {
alert("hey " + name + ", your magic number is " + this.magic);
};
现在我们想要基于hey
方法创建一个函数/方法alert
,该方法将调用次数限制为三次。我们已经有funky
函数来执行此操作:
MyAlerter.prototype.hey = funky(MyAlerter.prototype.alert, 3);
现在我们可以这样做:
var alerter = new MyAlerter(42);
alerter.hey("Bob"); // alert("hey Bob, your magic number is 42")
alerter.hey("Joe"); // alert("hey Joe, your magic number is 42")
alerter.hey("Sam"); // alert("hey Sam, your magic number is 42")
alerter.hey("Don"); // no alert, returns "No more"
将this
调用hey
的{{1}}传递给基础函数alert
,由fn.apply
funky
内alert
完成,{{1}收到正确的this
并能够访问幻数。
答案 1 :(得分:0)
你的意思是像for循环?
function funky (fn, n) {
for (var i = 0; i < n; i += 1) {
fn();
}
}
funky(function () {
alert('ABC');
}, 3);
如果您不希望它立即运行,那么您可以这样做:
function funky(fn, n) {
this.run = function() {
for (var i = 0; i < n; i += 1) {
fn();
}
}
}
var hey = new funky(function() {
alert('ABC');
}, 3);
hey.run();//Alerts ABC 3 times
此外:
function funky(fn, n) {
return function() {
for (var i = 0; i < n; i += 1) {
fn();
}
}
}
var hey = funky(function() {
alert('ABC');
}, 3);
hey();//Alerts ABC 3 times