首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >释放局部变量到窗口作用域变量?

释放局部变量到窗口作用域变量?
EN

Stack Overflow用户
提问于 2013-06-16 15:51:37
回答 1查看 91关注 0票数 1

我有一个全局变量NS,我可以这样从控制台访问该变量:

代码语言:javascript
复制
NS.some_func();

使用名为extendSafe()的方法填充NS。

代码语言:javascript
复制
some_scope.extendSafe = function (o1, o2) {
    var key;
    for (key in o2) {
        if (o2.hasOwnProperty(key) && o1.hasOwnProperty(key)) {
            throw "naming collision: " + key;
        }
        o1[key] = o2[key];
    }
    return o1;
};

这可以通过设置一个名为$P的公共作用域,然后在定义了所有$P方法之后复制到全局范围NS中来使用。

我想这样做,这样我就可以验证我没有写任何属性。

在我试图将局部变量保存到$P以供以后复制到NS之前,这一切都进行得很好。因为解释器不知道$P将被“释放”到窗口作用域,所以它不知道如何保持局部变量活动。所以我不能使用我的safeExtend方法。

我通过这样的直接复制来证实这就是问题所在:

代码语言:javascript
复制
NS.local = local;

我现在可以从控制台访问NS.local。

但是,如果我像我希望的那样复制它:

代码语言:javascript
复制
$P.local = local;
extendSafe(NS, $P);

局部变量不可用。

如何安全地发布它,即使用safeExtend()

代码片段

问题被评论为

// hacked needs a fix

代码语言:javascript
复制
    $P.machine = function (obj) {
        var pipe,
            data_send,
            ajax_type,
            wait_animation,
            set;
        wait_animation = document.getElementById('wait_animation');
        set = false;
        pipe = NS.makePipe(obj);
        if ($R.Parsel[pipe.model] === undefined) {
            return;
        }
        time('start');
        if ($R.Parsel[pipe.model].hasOwnProperty("pre")) {
            pipe = $R.Parsel[pipe.model].pre(pipe);
        } else {
            return;
        }
        if (pipe.form_data) {
            ajax_type = 'multi';
            var form_data = pipe.form_data;
            delete pipe.form_data;
            form_data.append("pipe", JSON.stringify(pipe));
            data_send = form_data;
        } else {
            ajax_type = 'post';
            data_send = 'pipe=' + encodeURIComponent(JSON.stringify(pipe));
        }
        if (pipe.state === true) {
            time('middle');
            if (wait_animation) {
                set = true;
                wait_animation.style.opacity = 1;
            }
            NS.ajax({
                type:     ajax_type,
                url:      NS.Reg.get('path') + NS.Reg.get('path_ajax'),
                data:     data_send,
                callback: function (pipe_string_receive) {
                    var pass_prefix = pipe_string_receive.slice(0, 3),
                        times;
                    if (wait_animation && set) {
                        wait_animation.style.opacity = 0;
                    }
                    if (pass_prefix === '|D|') {
                        NS.log('|DEBUG| ' + pipe_string_receive.slice(3));
                    } else if (pass_prefix === '|A|') {
                        time('middle');
                        pipe = JSON.parse(pipe_string_receive.slice(3));
                        if ($R.Parsel[pipe.model].hasOwnProperty("post")) {
                            pipe = $R.Parsel[pipe.model].post(pipe);
                            times = time('finish');
                            pipe.time.pre = times[0];
                            pipe.time.transit = times[1];
                            pipe.time.post = times[2];

                            // works but hacked needs a fix

                            NS.last = pipe;

                            // will not exendSafe()

                            $P.last = pipe;

                        } else {
                            return;
                        }
                    } else {
                        throw "<No 'A' or 'D'>" + pipe_string_receive;
                    }
                }
            });
        }
    };
EN

回答 1

Stack Overflow用户

发布于 2013-06-16 18:10:12

我知道你已经解决了这个问题,但我觉得你对JavaScript有一些误解:

在我试图将局部变量保存到$P以供以后复制到NS之前,这是很好的。因为解释器不知道$P将被“释放”到窗口作用域,所以它不知道如何保持局部变量活动。所以我不能使用我的safeExtend方法。 我通过这样的直接复制来证实这就是问题所在: NS.local =局部; 我现在可以从控制台访问NS.local。 但是,如果我像我希望的那样复制它: $P.local =局部;extendSafe(NS,$P); 局部变量不可用。 如何安全地发布它,即使用safeExtend()?

这没道理。JavaScript非常擅长跟踪对对象的引用。如果有对对象的引用,它不会垃圾收集对象。我不知道“将一个对象释放到窗口范围”意味着什么。没有任何这样的概念,只有对象和对它们的引用。

我试着查看您的原始代码,但是有很多代码与问题无关。如果您要将其简化为最小的测试用例,我敢打赌,一个更简单的解决方案将变得显而易见。

我确实在上面你的小片段中看到了一个问题。您将extendSafe()函数定义为some_scope.extendSafe(),但是这里使用的是一个普通的extendSafe()调用,而不是对some_scope的引用。它真的调用这个函数了吗?这只是一个小例子中的一个错误吗?

当然,如果你只是很高兴找到一个解决方案,并想继续前进,这是完全可以理解的!我只是有种强烈的感觉,这里有一些你不需要的额外代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17135034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档