在全局范围内运行javascript函数

时间:2018-04-24 07:12:53

标签: javascript

为了符合GDPR标准,我将所有联盟脚本包装在我们的网上商店内部并将其添加到作业队列中。

用户接受我们的隐私政策后,我会运行所有排队的工作。我想在全局范围中运行它们,因此所有声明的变量都可以在全局范围内访问,因为一些联盟脚本依赖于全局变量(我知道这很丑陋;))。

我知道,我可以重写所有javascript代码并在全局范围内声明varibales并将其余代码包装在函数中。 但后来我需要编辑很多外部模块(我们正在运行一个magento网店并使用外部模块来包含联盟脚本)

我目前的做法:

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 eval on global scope? (这不适用于函数)

eval.call(window, x, y, z)

2 个答案:

答案 0 :(得分:1)

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

我将函数体How to get function body text in JavaScript?)保存到字符串中并在窗口范围内进行评估

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");
    }
};

答案 1 :(得分:0)

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();

JS Bin

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

希望有所帮助