JavaScript / jQuery scope

JavaScript / jQuery scope

本文关键字:scope jQuery JavaScript      更新时间:2023-09-26

嗨,我正在扩展一个现有的插件使用静态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未定义。这一定是某种形式的范围问题,但我不能解决它?

这不是作用域。这是时机。

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

如果你从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..
             }  
    });