跟踪同一功能的多次运行,第2部分

时间:2011-02-04 06:45:11

标签: javascript function scope closures this

Thisthis

相关

无论如何我需要的是实际上有些不同我需要某种方式来做到这一点:

function run(arg) {
    this.ran = this.ran || false;
    if (!this.ran) init;
    /* code */
    this.ran = true;
}

这很好用,我只是想确保这个代码即使在this使用call()或apply()

调用时也能正常工作

检查this我正在谈论的内容,无论上下文如何,第一个之后的所有呼叫都应该是真的

3 个答案:

答案 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);