JavaScript / jQuery范围

时间:2013-05-16 08:55:06

标签: javascript jquery jquery-plugins

您好我正在扩展现有插件以使用静态JSON而不是从服务器加载它。这是扩展程序的精简版本:

(function ($) {
    $.fn.MyExtension = function (options) {
        return this.each(function () {
            if (opts.load_Json) {
                $.get("", function (result) {
                    fromJson(opts.load_Json)
                });
            }

            var fromJson = function (json) {
                    // json stuff..
                 }  
        });
});

如果我删除$.Get并在没有回拨的情况下直接致电fromJson,我会收到一条错误消息,指出fromJson未定义。这必须是某种形式的范围问题,但我不能解决它?

1 个答案:

答案 0 :(得分:5)

这不是范围。这是时机。

在传递给fromJson的匿名函数结束之前,函数未分配给each

如果您从get回调中调用它,那么该分配将在HTTP响应返回并且函数触发之前发生。

如果直接调用它,那它就不存在了。

重新排序:

    return this.each(function () {
        var fromJson = function (json) {
                // json stuff..
             }  

        if (opts.load_Json) {
            $.get("", function (result) {
                fromJson(opts.load_Json)
            });
        }

    });

或使用函数声明(将被吊起):

    return this.each(function () {
        if (opts.load_Json) {
            $.get("", function (result) {
                fromJson(opts.load_Json)
            });
        }

        function fromJson (json) {
                // json stuff..
             }  
    });