JavaScript/jQuery范围

pin*_*goo -1 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..
                 }  
        });
});
Run Code Online (Sandbox Code Playgroud)

如果我在没有回调的情况下直接删除$.Get和调用,fromJson我会收到错误消息,说明fromJson未定义.这必须是某种形式的范围问题,但我不能解决它?

Que*_*tin 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)
            });
        }

    });
Run Code Online (Sandbox Code Playgroud)

或使用函数声明(将被提升):

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

        function fromJson (json) {
                // json stuff..
             }  
    });
Run Code Online (Sandbox Code Playgroud)