无论如何我需要的是实际上有些不同我需要某种方式来做到这一点:
function run(arg) {
this.ran = this.ran || false;
if (!this.ran) init;
/* code */
this.ran = true;
}
这很好用,我只是想确保这个代码即使在this
使用call()或apply()
检查this我正在谈论的内容,无论上下文如何,第一个之后的所有呼叫都应该是真的
答案 0 :(得分:1)
为了充分利用闭包,我建议你将main函数包装在另一个启动“run”标志的函数中:
function initRun(){
var ran = ran || false;
return function(arguments){
if(ran)
{
console.log("can't run any more!");
return;
}
ran = true;
console.log("i'm running!");
/* your logic here */
}
}
var run = initRun();
然后你可以通过任何你想要的方式调用你的函数来测试它:
run();
run.call();
run.apply();
无论使用何种呼叫方法,它都只能成功运行一次 迷你缺点是你需要一个额外的功能来包装你的初始“运行”功能,但我认为它比使用跟踪你的函数调用的全局标志更可靠和优雅
答案 1 :(得分:0)
你可以用“arguments.callee”替换“this”。 arguments.callee应始终为您提供表示当前函数的对象,从而隔离您更改“this”。 (但我没有测试^^)
答案 2 :(得分:0)
定义独立功能时,“this”指的是全局窗口对象。在这种情况下,您也可以明确地使用全局变量,以避免任何“this”被篡夺.apply()或.call()的可能性......只要这是期望的行为。
function run(arg) {
window.ran = window.ran || false;
if (!window.ran) init();
/* code */
window.ran = true;
}
作为旁注,如果将函数定义为对象的属性,则“this”指的是拥有对象。请注意,“this”是对函数所有者的引用,所有者依赖于上下文。
编辑:同样,作为@Anurag建议的后续内容,这是不合适的吗?var run = (function createRun() {
var ran = false;
return function(arg) {
if (!ran) init;
// code
ran = true;
};
})();
run(arg);