2011-09-08 22 views
2

我试图让自己从具有if语句中一个很长的代码块,所以我想调用另一个函数到当前范围:内的另一个范围运行功能

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

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

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

在此先感谢!

回答

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

+0

+1,因为这可能是最好的方法 - 将变量放在作用域链上而不使其成为全局变量。 – RobG

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

+1邪恶的双胞胎! –

+0

Eval Twin甚至? – wesbos

+0

对不起,在问题中没有这样说 - 但我不想把它作为一个论点。 – mattsven

0

你可以设置一个功能的使用。适用)范围()或.CALL(但不会为你想要做什么工作。如果你在声明f之前声明了一个f(只是声明,你不需要分配任何东西),你可以做f();内联,就像你在这个例子中做的那样,它会工作。

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

(function(){ 
    a = "abc."; 
    f(); //not undefined! 
})(); 
+2

应用和调用与范围无关(绝对没有)。他们将函数的* this *关键字设置为特定的对象,就是这样。 – RobG

0

惊讶的没有人说过。这是我会做

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

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

这个例子实际上并没有做任何事情 - 'call'和'apply'只设置'this'关键字指向a的值。在你的例子中调用'sayhi()'和'sayhi.call(this)'和'this'都是全局上下文('window')。 – mattsven

+1

'sayhi.call({a:'foo'});'会工作,但在那一点上,为什么不只是传递参数? – Funkodebat