函数不返回变量

时间:2011-05-19 13:37:07

标签: javascript jquery cookies

我有一个函数,它接受一个参数(key)从cookie中检索它的值。我在任何需要特定信息的地方调用该函数。除了一切都以未定义的形式回归。

//before $(document).ready();
var keyval = ""; //VARIABLE FOR PASSING COOKIE VALUE
var getCookieVal =function(c_name){
var cleanCookie = document.cookie.substr(0, document.cookie.indexOf("; __utma="));//REMOVES EXTRA INFORMATION
var cookieArr = cleanCookie.split(";");//MAKES AN ARRAY OF EACH PAIR
    $.each(cookieArr, function(index, val){
        var valArr = val.split("=");//SPLITS THE KEY VALUE PAIR INTO AN ARRAY
        var key = valArr[0];
        keyval = valArr[1];
        if (key == c_name){
            alert(keyval);//ALERTS CORRECT ANSWER
            return keyval;
        }
    });
    console.log(keyval);//RETURNS UNDEFINED
}

//IN ANOTHER FILE I CALL THE FUNCTION:
$(document).ready(function(){
    getCookieVal("username");
    alert(keyval);//RETURNS UNDEFINED
});

任何人都知道我做错了什么或我如何获得这个价值?

4 个答案:

答案 0 :(得分:2)

你走了:

var getCookieVal = function(key) {
    var coo = document.cookie;
        arr = coo.substr(0, coo.indexOf('; __utma=')).split(';'),
        value;
    $.each(arr, function(i, v) {
        var valArr = v.split('=');
        if ( valArr[0] === key ) {
            value = vallArr[1];
            return false;
        }            
    });
    return value;
};

$(document).ready(function() {
    var keyval = getCookieVal('username');
    alert(keyval);
});

所以你在if-branch内部return false(一旦找到所需的值)就会突破$.each循环。然后,您只需return value函数中的getCookieVal

请注意,无需可在此处定义全局keyval变量。

答案 1 :(得分:1)

这一行:

return keyval;

...从您传递给$.each的匿名函数返回,而不是从您的getCookieVal函数返回。

答案 2 :(得分:0)

您需要return false才能摆脱循环。否则,循环继续并覆盖keyval。您正在返回keyval,这不会破坏循环。将其更改为false,您应该很好。

答案 3 :(得分:0)

您的代码可以简化为此(假设getCookieVal的调用者是可信的)

function getCookieVal(name)
{
    var pattern = new RegExp('(?:^|;)' + name + '=([^;]*)', 'i'),
         matches = pattern.exec(document.cookie);
    return matches ? matches[1] : null;
}

$(document).ready(function() {
    var keyval = getCookieVal('username');
    alert(keyval);
});