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

时间:2015-03-22 18:50:54

标签: javascript

我正在使用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>

如果查看substringMatcher函数,则参数strs未定义。我将它传递到typeahead源的底部。 projectNumbers当我将数据传递给函数时,有数据,即使我将其记录到控制台,它也有数据。但是未定义。

任何建议?

更新

当我加载页面时,我正在记录getJSON的返回并填充它(第7行)。如果这是填充的,那么当我将其作为参数传递时,为什么它不会填充?

1 个答案:

答案 0 :(得分:0)

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

source: substringMatcher(projectNumbers)

projectNumbers可能尚未初始化。但是当您调用由substringMatcher(projectNumbers)创建的函数时,projectNumbers会被初始化。这就是你得到的原因:

console.log(strs); // Undefined console.log(projectNumbers); //Filled