我有一个函数,我希望它在每次触发时执行交替进程。关于如何实现这一目标的任何帮助都会很棒。
function onoff(){
statusOn process /*or if on*/ statusOff process
}
答案 0 :(得分:7)
JavaScript的一个有趣的方面是函数是第一类对象,这意味着它们可以具有自定义属性:
function onoff() {
onoff.enabled = !onoff.enabled;
if(onoff.enabled) {
alert('on');
} else {
alert('off');
}
}
为此,您的功能应该有一个名称。如果您的函数是匿名的(未命名),您可以尝试使用arguments.callee
来访问它,但在新的ES5标准中不推荐使用它,并且在使用其严格模式时不可以。
答案 1 :(得分:5)
通过使用闭包,您可以定义一个只能由函数本身访问的静态变量:
var toggle = (function()
{
var state = true;
return function()
{
if(state)
alert("A");
else
alert("B");
state = !state;
};
})();
现在您可以反复调用toggle()
,它会在"A"
和"B"
之间切换。 state
变量无法从外部访问,因此您不会污染全局变量范围。
答案 2 :(得分:3)
使用闭包。除了闭包之外,这个方法还演示了任意参数和任意数量的函数来循环:
function cycle() {
var toCall = arguments;
var which = 0;
return function() {
var R = toCall[which].apply(this, arguments);
which = (which+1) % toCall.length; // see NOTE
return R;
}
}
演示:
function sum(a,b) {return a+b}
function prod(a,b) {return a*b}
function pow(a,b) {return Math.pow(a,b)}
function negate(x) {return -x;}
var f = cycle(sum, prod, pow, negate);
console.log(f(2,10)); // 12
console.log(f(2,10)); // 20
console.log(f(2,10)); // 1024
console.log(f(2)); // -2
// repeat!
console.log(f(2,10)); // 12
console.log(f(2,10)); // 20
console.log(f(2,10)); // 1024
console.log(f(2)); // -2
或者,如果您不希望假设所有循环的东西都是函数,则可以使用此模式。在某些方面它更优雅;在某些方面它不那么优雅。
function cycle() {
var list = arguments;
var which = 0;
return function() {
var R = list[which];
which = (which+1) % toCall.length; // see NOTE
return R;
}
}
演示:
var cycler = cycle(function(x){return x}, 4, function(a,b){return a+b});
cycler()(1); // 1
cycler(); // 4
cycler()(1,5); // 6
// repeat!
cycler()(1); // 1
cycler(); // 4
cycler()(1,5); // 6
注意:因为javascript认为10000000000000001%2
是0(即这个数字是偶数),这个函数必须比所需的时间长三个,否则你只能在它之前调用这个函数10千万亿次给出了错误的答案。您不太可能在单个浏览会话中达到此限制...但谁知道
答案 3 :(得分:2)
如果我理解你想要的东西,这可能就是你要找的东西:
var AlternateFunctions = function() {
var one = function() {
// do stuff...
current = two;
}, two = function() {
// do stuff...
current = one;
}, current = one;
return function() {
current();
}
}();
然后调用AlternateFunctions();
将在one()
和two()
答案 4 :(得分:1)
已经发布了几个好的答案,但我想知道你想要实现的目标。如果你跟踪一些DOM元素的状态,而不是在函数中保存状态,你应该检查元素的状态,以便函数不在真空中运行(并且可能没有按照你的预期运行)。您可以检查一些属性,例如class:
function onoff(obj){
if(obj.className === 'on') {
obj.className = 'off';
}else{
obj.className = 'on';
}
}
答案 5 :(得分:0)
var last=0;
function toggle() {
if(last) {
last=0;
// do process 2
}
else {
last=1;
// do process 1
}
}
答案 6 :(得分:0)
var status=true;
function onOff(el){
/*
* toggle
*/
status = (status ? false : true);
status
? el.html('on')
: el.html('off');
}