【问题标题】:Can i run javascript in global execution context without eval我可以在没有 eval 的全局执行上下文中运行 javascript
【发布时间】:2015-10-20 10:37:52
【问题描述】:

我正在编写 php 框架,它提取 Javascript 块以异步合并、缩小和执行它们。

所以我喜欢延迟 Javascript 代码的执行,为此我将 javascript 包装在里面

MyLib.then(function(){
//orignial code from the templates....
}

这很好用,除非包装的代码需要创建全局变量 (我不是包装代码的作者,所以我不想修复该代码) 相反,我喜欢在全局执行上下文中运行该代码。

例如:

//excample code not within my controle  
var global="Hello World";

会变成:

MyLib.then(function(){
   //excample code not within my controle  
   var global="Hello World";
}

现在的解决方案是将javascript放入一个字符串,然后

MyLib.then(function(){
     $.globalEval("var global=\"Hello World\"";");
}

或者在我的库中使用 globalEval 调用

MyLib.then("var global=\"Hello World\"";")

但我想坚持使用可读性更好的版本,这对于框架的用户来说也更容易调试。

MyLib.then(function(){
   var global="Hello World";
}

并通过使用更改我的库中的执行上下文 callback.call(window) 之类的,可以吗?

【问题讨论】:

    标签: javascript executioncontext


    【解决方案1】:

    你也可以在全局上下文中声明你的变量,然后在一个范围内初始化它:

    var globalVariable;
    MyLib.then(function(){
        globalVariable = "a value";
    });
    

    如果您的代码已经在作用域内运行,您可以继续:

    (function(global){
        // my logic
        global.myVar = "a value";
    })(this);
    

    【讨论】:

      【解决方案2】:

      是的。您可以将其添加到窗口/文档对象中。

      例如:window.var = "Hello"

      当使用窗口对象时,它可以从任何地方访问。您也可以创建自己的全局对象。

      【讨论】:

      • @Keywan Ghadami 你是什么意思?
      • 代码 var global="Hello World" 是其他开发人员编写的 JavaScript 示例,应该继续运行。即使它包含在我的代码中。我无法更改该代码,只能更改其包装方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 2023-02-06
      • 2019-03-15
      • 2016-12-25
      相关资源
      最近更新 更多