使用在另一个函数中定义的相同变量

时间:2011-07-21 17:25:33

标签: javascript

这对某些人来说可能看起来很简单,但我对JavaScript的经验不足。我有两个功能。我的上传开始时会调用一个。我上传结束时会调用下一个。

在第一个函数中,创建一个变量,一个用于上传的唯一ID。在第二个函数中重用它的最佳方法是什么,因为它不是全局的?我在我的函数中定义它的原因是因为每次用户单击上传按钮时,都会调用该函数并为该上载创建一个NEW id,这就是为什么我不想在外面定义它,因为那时相同的id会除非页面被刷新,否则将被提供第二次上传。

有人有任何建议吗?

function uploadstart() {

    function makeid() {
        var text = "";
        var possible = "abcdefghijklmnopqrstuvwxyz0123456789";

        for( var i=0; i < 32; i++ )
            text += possible.charAt(Math.floor(Math.random() * possible.length));

        return text;
    }

    var rand_id = makeid();

}

uploadfinish(){
    //rand_id will be undefined
}

4 个答案:

答案 0 :(得分:3)

将该var作为参数传递

uploadstart(){
function makeid()
{
    var text = "";
    var possible = "abcdefghijklmnopqrstuvwxyz0123456789";
for( var i=0; i < 32; i++ )
    text += possible.charAt(Math.floor(Math.random() * possible.length));

return text;
}
var rand_id=makeid();

//Pass in rad_id
uploadfinish(rand_id);
}

uploadfinish(radomID){
//rand_id will be undefined
}

答案 1 :(得分:2)

尝试在全局范围内声明rand_id(在所有内容之前)

var rand_id;
function bla....

答案 2 :(得分:1)

此问题的解决方案取决于您使用这两个功能的方式和位置。如果你将它们作为回调传递给某个ajax库中的另一个函数,或类似的东西,并且如果你控制那个库调用,你可以使用一个闭包。

所以,例如,如果您在上传开始时做了类似的事情:

Library.foo(..., uploadstart, uploadfinish);

您可以将makeID定义为全局函数,然后使用如下函数将生成的id绑定到回调函数:

function bind_id(rand_id, my_function) {      
  return function() { // return a closure
    return my_function(); // my_function is executed in a context where rand_id is defined
  }
}

然后使用rand_id定义回调,就像它是全局的一样(实际上,它将在闭包中定义):

function uploadstart() {
  // use rand_id as you wish
}

function uploadend() {
  // use rand_id as you wish
}

当您需要调用Library.foo函数时,首先生成rand_id,然后将其绑定到开始和结束回调:

var new_rand_id = randID();

Library.foo(..., bind_id(new_rand_id,uploadstart), bind_id(new_rand_id,uploadend));

这样你就可以传递给foo而不是原始的uploadstart和uploadend,但是两个闭包定义了rand_id,两者都是相同的,所以回调代码可以使用那个变量。

PS:闭包是javascript最强大,最棘手的功能之一。如果你对这门语言很认真,那就花点时间好好学习。

答案 3 :(得分:0)

一旦你创建了rand_id,你会怎么做?你能不能用uploadfinish作为参数来呼叫rand_id吗?

function makeid()
{
   ...
}
var rand_id=makeid();
uploadfinish(rand_id);
}

uploadfinish(id){
//rand_id will be 'id'
}

[编辑]由于您说您需要在外部调用该函数,请查看此页面以获取有关回调的详细信息:Create custom callbacks

function doSomething(callback) {
    // ...

    // Call the callback
    callback('stuff', 'goes', 'here');
}

function foo(a, b, c) {
    // I'm the callback
    alert(a + " " + b + " " + c);
}

doSomething(foo);
  

这将调用doSomething,它将调用foo,它将发出警报   “东西就在这里”。

     

请注意,传递函数引用doSomething(foo)非常重要,   而不是调用函数并传递其结果,如下所示:doSomething(foo())。