在全局范围内运行javascript函数

在全局范围内运行javascript函数,javascript,Javascript,为了符合GDPR,我将所有附属脚本包装在我们的webshop内部函数中,并将它们添加到作业队列中 在用户接受我们的隐私策略后,我运行所有排队作业。我想在全局范围内运行它们,这样所有声明的变量都可以在全局范围内访问,因为一些附属脚本依赖于全局变量(我知道这很难看;) 我知道,我可以重写所有javascript代码,在全局范围内声明varibales,并将其余代码包装到函数中。 但是我需要编辑大量的外部模块(我们正在运行一个magento webshop,并使用外部模块来包含附属脚本) 我目前的做法

为了符合GDPR,我将所有附属脚本包装在我们的webshop内部函数中,并将它们添加到作业队列中

在用户接受我们的隐私策略后,我运行所有排队作业。我想在全局范围内运行它们,这样所有声明的变量都可以在全局范围内访问,因为一些附属脚本依赖于全局变量(我知道这很难看;)

我知道,我可以重写所有javascript代码,在全局范围内声明varibales,并将其余代码包装到函数中。 但是我需要编辑大量的外部模块(我们正在运行一个magento webshop,并使用外部模块来包含附属脚本)

我目前的做法是:

var jobQueue = [];
var add = function (fn) {
    jobQueue.push(fn);
    console.log("function pushed to queue");
};
var execute = function () {
    while ((curJob = jobQueue.pop()) !== undefined) {
        curJob();
        console.log("executed job");
    }
};
我的问题是,一些外部脚本依赖于在我的作业中声明的变量。是否有可能像全局运行代码一样运行函数

我已经找到了类似的东西,但我无法让它工作: (这不适用于函数)


Javascript中的变量具有“函数作用域”,这意味着如果在函数中声明变量,则无法从该函数外部访问该变量。 但是,当函数中不存在变量时,Javascript将在函数外部查找该变量,直到它到达全局对象

因此,全局对象中声明的变量随处可见

只需在全局范围中声明变量,就可以将变量分配给全局范围

var pushing = "function pushed to queue";
var executed = "executed job";
var jobTitle = "... programing ...";

var jobQueue = [];
var add = function (fn) {
    jobQueue.push(fn);
    console.log( pushing );
};
var execute = function () {
    while ((curJob = jobQueue.pop()) !== undefined) {
        curJob();
        console.log( executed );
    }
};

// Lets add a Job
add( function(){ console.log( jobTitle ); } );

execute();

如您所见,添加的作业可以访问在全局范围中声明的变量jobTitle


希望有帮助

我找到了一个可能的解决方案,但它很丑陋:

我将函数的主体保存为字符串,并在窗口范围内对其求值

var execute = function () {
    while ((curJob = jobQueue.pop()) !== undefined) {
        var entire = curJob .toString(); 
        var body = entire.slice(entire.indexOf("{") + 1, entire.lastIndexOf("}"));
        eval.call(window, body);
        console.log("executed job");
    }
};

如何调用
add
execute
函数?如果它们是您的函数,您可以以不同的方式声明变量(而不是使用
var
)。但老实说,我会去掉任何要求你的变量是全局变量的代码。我也不喜欢它,但我需要它来让附属脚本工作。由于gdpr,我更改了代码,并在用户接受我们的隐私政策后声明/加载变量/脚本。。。然而。。。在全局范围内运行的代码现在封装在函数中,稍后调用。。。但是当加载外部附属脚本时,它需要全局范围内的变量我想你有很多函数使用相同的变量,所以通过将变量放在全局执行上下文中,所有函数都可以访问变量?@ThumChoonTat我正在将我的所有附属脚本包装在一个函数块中的网站上,并将它们添加到我的作业队列中。。。当用户接受隐私政策(因为gdpr)时,我会执行所有排队作业STHX以获得您的答案,但我不想编辑我网站上的所有脚本,我只是将所有内联附属脚本包装在函数中,以便在不同的时间运行它们(在用户接受隐私政策之后)。。。。我知道我可以手动声明全局范围内所需的所有变量,但这太费劲了,因为我们正在运行由一些外部模块呈现的多个附属脚本(我们正在运行magento webshop)。。。如果我想以不同的方式声明变量,我需要编辑所有模块如果您需要访问在其他地方的函数中声明的变量,您需要将它们存储在共享范围中。使用iife的目的是防止全局定义。您可以做的是在全局空间中声明单个对象,并将所有变量存储在其中。这就是jQuery使用$()
var execute = function () {
    while ((curJob = jobQueue.pop()) !== undefined) {
        var entire = curJob .toString(); 
        var body = entire.slice(entire.indexOf("{") + 1, entire.lastIndexOf("}"));
        eval.call(window, body);
        console.log("executed job");
    }
};