Javascript 为什么传递给函数的参数未定义?

Javascript 为什么传递给函数的参数未定义?,javascript,Javascript,我正在使用typeahead.js,下面是代码: <script> $(function () { var projectNumbers; $.getJSON("api/Project/GetAllNumbers") .done(function (result) { console.log(result); projectNumbers = result

我正在使用typeahead.js,下面是代码:

<script>
    $(function () {

        var projectNumbers;
        $.getJSON("api/Project/GetAllNumbers")
            .done(function (result) {
                console.log(result);
                projectNumbers = result;
            })
            .fail(function (jqXHR, textStatus, err) {
                alert('Error: ' + err);
            });

        var substringMatcher = function (strs) {
            return function findMatches(q, cb) {
                var matches, substrRegex;
                console.log(strs); // Undefined
                console.log(projectNumbers); //Filled
                // an array that will be populated with substring matches
                matches = [];

                // regex used to determine if a string contains the substring `q`
                substrRegex = new RegExp(q, 'i');

                // iterate through the pool of strings and for any string that
                // contains the substring `q`, add it to the `matches` array
                $.each(strs, function (i, str) {
                    if (substrRegex.test(str)) {
                        // the typeahead jQuery plugin expects suggestions to a
                        // JavaScript object, refer to typeahead docs for more info
                        matches.push({ value: str });
                    }
                });

                cb(matches);
            };
        };

        $('#jobNumber').typeahead({
            hint: true,
            minLength: 3,
            highlight: true,
        },
          {

              name: 'projects',
              source: substringMatcher(projectNumbers),
          });

    });
</script>

$(函数(){
var项目编号;
$.getJSON(“api/Project/GetAllNumber”)
.完成(功能(结果){
控制台日志(结果);
项目编号=结果;
})
.fail(函数(jqXHR、textStatus、err){
警报(“错误:”+err);
});
var substringMatcher=函数(strs){
返回函数findMatches(q,cb){
var匹配,子关系x;
console.log(strs);//未定义
console.log(projectnumber);//已填充
//将填充子字符串匹配项的数组
匹配项=[];
//用于确定字符串是否包含子字符串'q'的正则表达式`
substregex=新的RegExp(q,‘i’);
//在字符串池中迭代并查找
//包含子字符串'q',将其添加到'matches'数组中
$。每个(str,功能(i,str){
if(子相关性测试(str)){
//typeahead jQuery插件希望用户提供建议
//JavaScript对象,有关更多信息,请参阅typeahead文档
匹配.push({value:str});
}
});
cb(比赛);
};
};
$(“#作业编号”)。请提前键入({
提示:没错,
最小长度:3,
推荐理由:没错,
},
{
名称:'项目',
来源:子字符串匹配器(项目编号),
});
});
如果查看substringMatcher函数,则参数strs未定义。我在typeahead源的底部传递它。当我将projectNumbers传递到函数中时,projectNumbers具有数据,甚至当我将其记录到控制台时,它也具有数据。然而,strs尚未定义

有什么建议吗

更新


当我加载页面时,我将记录getJSON的返回,并填充它(第7行)。如果已经填充了,为什么当我将其作为参数传递时它没有填充?

这是因为您的代码是异步的。您的
getJSON done()
将在其余代码之后执行。所以当你执行

来源:子字符串匹配器(项目编号)

projectnumber
可能尚未初始化。但是当您调用由
子字符串匹配器(projectNumbers)
创建的函数时,
projectNumbers
被初始化。这就是为什么你会得到:

console.log(strs);//未定义

控制台日志(项目编号)//填充

您返回的是一个函数,而不是调用该函数并返回结果。当然变量是未定义的。我认为这是因为您的代码是异步的。getJSON done()在代码的其余部分之后执行。因此,当您执行“source:substringMatcher(projectNumbers)”时,“projectNumbers”可能尚未初始化。但是当您调用由“substringMatcher(projectNumbers)”创建的函数时,“projectNumbers”被初始化。这就是为什么:console.log(strs);//未定义的console.log(项目编号)//如果答案正确,请告诉我,在这种情况下我会给出答案。@nit与其嘲笑OP,不如解释一下如何修复它?@JuanMendes我指出了问题所在,你在说什么?@nit为什么我返回一个函数会导致我传入的参数未定义。我没有试图返回参数,只是使用它?