【问题标题】:keeping track of multiple runs of the same function, part 2跟踪同一函数的多次运行,第 2 部分
【发布时间】:2011-06-21 04:25:51
【问题描述】:

Thisthis 相关

无论如何,我需要的实际上是稍微不同的东西,我需要某种方式来做到这一点:

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

这很好用,我只是想确保即使this 使用 call() 或 apply() 调用此代码也能正常工作

检查this 了解我在说什么,第一个电话之后的所有电话都应该是真实的,无论上下文如何

【问题讨论】:

  • 我的answer here 在你的其他问题上是否处理这个问题?
  • 删除了我的答案,因为您的原始问题包含完全相同的解决方案。

标签: javascript function scope closures this


【解决方案1】:

为了充分利用闭包,我建议你将你的主函数包装在另一个启动“运行”标志的函数中:

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();

无论使用何种调用方法,它只成功运行一次。
小缺点是你需要一个额外的函数来包装你的初始“运行”函数,但我认为它比使用跟踪函数调用的全局标志更可靠和优雅

【讨论】:

    【解决方案2】:

    您可以将“this”替换为“arguments.callee”。 arguments.callee 应该始终为您提供代表当前函数的对象,从而使您无法更改“this”。 (不过我没有测试^^)

    【讨论】:

    • arguments.callee 将从新的 EMCA 脚本中删除。我正在寻找可以保持最新状态的东西
    • @qwertymk:你有引用吗?因为这个:developer.mozilla.org/en/JavaScript/Reference/… 说:JavaScript 1.4:弃用被调用者作为 Function.arguments 的属性,将其保留为函数的局部参数变量的属性
    【解决方案3】:

    定义独立函数时,“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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      相关资源
      最近更新 更多