Dojo 1.8 - 在require中创建全局变量

And*_*ham 5 javascript dojo scope

我注意到,在我的团队升级到Dojo 1.8之后,我正在为项目工作的一些遗留脚本不再工作了.具体来说,他们创建的全局变量不再被创建.

我挖了一遍,发现Dojo 1.8团队非常反对全局变量.事实上,如此反对,他们认为用户在物理上不可能在需要的末尾使用以下代码在必需的脚本中创建全局变量:

req.eval =
        function(text, hint){
            return eval_(text + "\r\n////@ sourceURL=" + hint);
        };
var eval_ = new Function('return eval(arguments[0]);');
Run Code Online (Sandbox Code Playgroud)

这很好,但是我正在使用的旧代码无法更改,所以我一直在试图弄清楚如何解决这个问题并在本地环境中执行eval.

幸运的dojo.eval是,Dojo的旧版本仍然存在,这就是我想要的.所以我只需要访问req.eval并更改要执行的功能,return dojo.eval(...)甚至只是eval(...)在某些情况下.

问题是,我无法弄清楚如何获得访问权限req.这是发生的事情:

dojo.js在HTML文件的顶部包含脚本标记.它加载在自己的脚本文件中.

dojo.require可以从我自己的文件访问.它define在脚本文件中定义:

'dojo/_base/loader':function(){
define(["./kernel", "../has", "require", "module", "./json", "./lang", "./array"], function(dojo, has, require, thisModule, json, lang, array) {
Run Code Online (Sandbox Code Playgroud)

我不确定这是否重要.无论如何,在范围内dojo.require,我可以看到一些叫做的东西injectModule,而在我自己的文件中我却做不到. injectModule是一个局部变量,所以你无法看到它this.它在文件开头的匿名函数中定义,即

(function(){ ... injectModule = function(){} ... })();
Run Code Online (Sandbox Code Playgroud)

injectModule函数内部,有以下行:

req.getText(url, legacyMode!=sync, xhrCallback);

去哪了req.eval.所以injectModule可以看到req.

我不知道该怎么做.我的邪恶JavaScript技巧都没有帮助我开始浏览这个范围的僵局.一个好的开始是弄清楚如何injectModule从我的外部脚本文件中看到调用dojo.require.但是,我无法使用'bind'来执行此操作,因为它是匿名函数中定义的局部变量.这甚至可能吗?

为了使事情变得更容易,这是一个总结:

档案1:

<script src="dojo.js"></script>
dojo.require(File 3);
console.log(globalVar);
Run Code Online (Sandbox Code Playgroud)

文件2:

(function(){req.eval = unhelpful function})();
define(["require"], function(module){
    dojo.require = function(x){req.eval(x)}
});
Run Code Online (Sandbox Code Playgroud)

档案3:

globalVar = ...;
Run Code Online (Sandbox Code Playgroud)

我可以修改文件1和3,但文件3总是需要一个全局变量.我无法修改文件2.目标是req.eval在文件2中更改为更好的功能.

之前声明全局变量不起作用,因为范围更改意味着文件3仍然无法看到它.

反射和字符串替换不起作用,因为范围错误并且JS在服务器端缩小.

覆盖文件1中的方法不起作用,因为我看不到范围.

使用JavaScript bind函数也毫无结果.

sli*_*kts 2

全局作用域可以通过全局对象来访问window,因此window.foo = 'bar'与创建全局变量相同foo。有关此的更多详细信息,请访问:/sf/answers/340358791/