【问题标题】:Run function inside another scope在另一个范围内运行函数
【发布时间】:2011-11-12 16:22:27
【问题描述】:

我试图避免在 if 语句中包含很长的代码块,因此我试图在当前范围内调用另一个函数:

var f = function(){ alert(a); };

(function(){
    var a = "abc.";
    f(); //undefined
    eval("("+f+")()"); //this works, but eval is evil
})();

我可能遗漏了有关范围的一些非常基本的内容,甚至遗漏了其他(更好的)方法来处理整个事情,但我无法弄清楚它是什么。关于如何做到这一点的任何想法?我不想通过函数参数传入我需要的变量。

提前致谢!

【问题讨论】:

    标签: javascript function object scope


    【解决方案1】:

    很惊讶没有人这么说。这就是我会做的

    function sayhi () {
        alert("hi " + this.a);
    }
    
    (function () {
        this.a = "foo";
        sayhi.call(this);
    }());
    

    【讨论】:

    • 这个例子实际上并没有做任何事情——callapply 只设置了this 关键字在函数中指向的值。在您的示例中调用sayhi()sayhi.call(this)this 中的相同是全局上下文(window)。
    • sayhi.call({a: 'foo'}); 会起作用,但到那时,为什么不只是传递参数呢?
    【解决方案2】:

    如果您不想将所需的变量作为参数传递,则需要确保您调用的函数与定义这些变量的范围相同(或更低)。

    因此,在您的情况下,如果您将var f = ... 定义带入括号中的立即执行函数中,它将与变量a 在同一范围内。我不确定这与您提到但未包含在您的代码示例中的 if 语句是否相符,但您可以执行以下操作:

    (function(){
      var f = function(){ alert(a); };
    
      // other code here if you have any
      var a;
    
      if ("your if condition" == "something") {
        a = "abc.";
        f();
      }
    })();
    

    或者只是在声明 f 的地方声明 a

    【讨论】:

    • +1 因为这可能是最好的方法 - 将变量放在作用域链上而不使其成为全局变量。
    【解决方案3】:

    您需要确保将要警告的变量传递给函数

    var f = function(a){ alert(a); };
    
    (function(){
        var a = "abc.";
        f(a); //passing it the reference to a
    })();
    

    编辑:如果你真的不想传递变量。您需要首先在全局范围内设置a。在函数中使用var 时,您正在创建该函数的本地变量。把 var 去掉,你只是在更新它的全局版本。

    var f = function(){ alert(a); };
    var a = ""; // declare a in global scope
    
    (function(){
        a = "abc."; // dont use var, we just update the global scope.
        f(); // F runs and grabs a from global scope
    })();
    

    【讨论】:

    • 抱歉,问题中没有这样说 - 但我不想将其作为参数传递。
    • 更新了我的答案,但请不要这样做,一旦你的代码变大,你会很头疼。
    • @Wes,仅供参考-您的var a = ""; 是多余的。您可以摆脱它并获得相同的结果。您首先声明的 a(带有关于它在全局范围内的注释)引用的对象与您稍后设置的值的 a 不同。
    • 你是对的,全部省略 var 只会把它扔到全局范围内,但这是非常糟糕的做法。始终在它们打算存在的范围内声明变量。
    • @evan - 声明 a 并不是多余的。如果未声明 a,则在匿名函数中分配给 a 的行运行之前调用 f() 将引发引用错误.在声明中为 a 赋值是多余的。
    猜你喜欢
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多