几个函数Javascript中的范围

时间:2014-04-29 12:35:30

标签: javascript scope

我试图用一个函数生成一个变量并在另一个函数中使用它,然后再将它传递给第二个函数的另一个函数。我已经尝试以多种方式将变量放在括号内,但我似乎无法让变量在最终函数中发出警报。 JSfiddle

function randomNumber(randomstring) {
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
    var string_length = 16;
    var randomstring = '';
    for (var i=0; i<string_length; i++) {
        var rnum = Math.floor(Math.random() * chars.length);
        randomstring += chars.substring(rnum,rnum+1);
    }
    //document.randform.randomfield.value = randomstring;
     // alert(randomstring);
}

$("#btn").click( function() {
        randomNumber(); 
        //alert(randomstring);
        update();
});

function update() {
    alert(randomstring);
}

我已经浏览了几个关于Scope的文档,但我看不到我在这里做的不是很好。

5 个答案:

答案 0 :(得分:3)

在函数内声明的变量var语句仅在该函数中可见。

所以,你可以返回randomString并传递它,就像这样

function randomNumber(randomstring) {
    ...
    ...
    return randomstring;
}

$("#btn").click( function() {
    update(randomNumber());
});

function update(randomstring) {
    alert(randomstring);
}

答案 1 :(得分:1)

您必须在包含使用它的所有函数的作用域中声明它。

var randomstring; // e.g. here

function randomNumber(randomstring) {
    randomstring = ''; // No var here. Use the existing one, not a new one in local scope

答案 2 :(得分:1)

var randomstring = '';名称空间中定义global,而不是randomNumber函数

JS

var randomstring = '';
function randomNumber() {
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
    var string_length = 16;
    randomstring = '';
    for (var i=0; i<string_length; i++) {
        var rnum = Math.floor(Math.random() * chars.length);
        randomstring += chars.substring(rnum,rnum+1);
    }
}

$("#btn").click( function() {
        randomNumber();
        update();
});

function update() {
    alert(randomstring);
}

<强> Demo Link

答案 3 :(得分:1)

randomstring变量具有randomNumber范围。因此,您可以选择如何允许更新功能使用它。

  1. 使其成为全局变量 - 这是最糟糕的解决方案。
  2. 重写更新函数 - 使用randomString作为参数调用更新函数,如下所示:

    function update(randomstring) { alert(randomstring); }

  3. 创建对象 - 将randomstring作为所述对象属性的对象中的两个函数进行包装。这是一个例子:

  4. JSFiddle:http://jsfiddle.net/GFK6B/3/

    var obj = {
        randomNumber: function() {
            var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
            var string_length = 16;
            var randomstring = '';
            for (var i=0; i<string_length; i++) {
                var rnum = Math.floor(Math.random() * chars.length);
                randomstring += chars.substring(rnum,rnum+1);
            }
    
            this.randomstring = randomstring
        },
        update: function() {
            alert(this.randomstring)
        }
    }
    
    $("#btn").click(function() {
        obj.randomNumber()
        obj.update()
    })
    

答案 4 :(得分:0)

你没有从第一个函数返回anthing是通过将randomString作为全局变量http://jsfiddle.net/venkatjp/GFK6B/2/来实现它的一种方法。 第一个函数中为return randomstring;,点击事件中为randomstring = randomNumber(randomstring);