This is related to this
Anyway what I need is actually something slightly different I need some way of doing this:
function run(arg) {
this.ran = this.ran || false;
if (!this.ran) init;
/* code */
this.ran = true;
}
This works fine, I just want to make sure that this code works even when this
in case it was called with call() or apply()
Check this out for what I'm talking about, All of the calls after the first one should all be true, no matter the context
得到充分利用封闭的,我建议你换你的主要功能是启动另一个功能“跑”标志:
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();
它成功运行只有一次,无论使用的调用方法。
迷你缺点是,你需要一个包您最初的“运行”功能的额外功能,但我认为这是更可靠,更优雅比使用,让您的函数调用的跟踪全局标志
你可以将“这一”被“arguments.callee的”。 arguments.callee的应该永远给你代表你当前的功能从而更改“这个”隔离你的对象。 (不过我没有测试^^)
当你定义一个独立的功能,“这”指的是全局的window对象。 如果是这样的话,你可能也仅仅使用全局变量明确,以避免“本”从被。适用篡夺()或.CALL的任何机会()......只要是所期望的行为。
function run(arg) {
window.ran = window.ran || false;
if (!window.ran) init();
/* code */
window.ran = true;
}
作为一个侧面说明,如果你定义一个函数作为一个对象的属性,“这”指的是所属对象。 需要注意的是“本”是一个功能的所有者的引用,车主取决于上下文。
编辑:另外,作为后续以@阿努拉格的建议,这是不合适的?
var run = (function createRun() {
var ran = false;
return function(arg) {
if (!ran) init;
// code
ran = true;
};
})();
run(arg);