在另一个范围内运行函数

时间:2011-09-08 04:51:12

标签: javascript function object scope

我试图阻止自己在if语句中使用非常长的代码块,所以我试图将另一个函数调用到当前范围内:

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

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

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

提前致谢!

3 个答案:

答案 0 :(得分:1)

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

因此,在您的情况下,如果将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();
  }
})();

或者只需在声明a的同一位置声明f

答案 1 :(得分:0)

您需要确保将要提醒的变量传递给函数

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

答案 2 :(得分:-1)

惊讶没人说这个。这就是我要做的事情

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

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