&引用;使用“严格”+;jQuery.getScript()=脚本可以';无法导出到全局命名空间

&引用;使用“严格”+;jQuery.getScript()=脚本可以';无法导出到全局命名空间,jquery,global-variables,getscript,use-strict,Jquery,Global Variables,Getscript,Use Strict,假设我有以下脚本,名为include\u strict.js。在它执行之后,我应该定义窗口。global1: "use strict"; var globalVar = {}; alert(typeof window.globalVar); 但是如果我从javascript块中包含它 $.getScript("include_strict.js"); 警报显示未定义。为什么?这是怎么回事 仅供参考,如果我使用脚本标记包含文件,则不会发生这种情况: <script type="text

假设我有以下脚本,名为
include\u strict.js
。在它执行之后,我应该定义
窗口。global1

"use strict";

var globalVar = {};
alert(typeof window.globalVar);
但是如果我从javascript块中包含它

$.getScript("include_strict.js");
警报显示
未定义
。为什么?这是怎么回事

仅供参考,如果我使用脚本标记包含文件,则不会发生这种情况:

<script type="text/javascript" src="include_strict.js"></script>

在这里,我看到了预期的警报,
对象
。如果我删除
“使用严格”
,然后是
jQuery.getScript()
具有与显示
对象
相同的效果

我创建了一个示例()来演示这一点。

它使用
$.getScript()
来执行脚本,该脚本使用
eval
来执行无法在严格模式下修改全局范围的脚本:

其次,严格模式代码的
eval
不会将新变量引入周围范围。在普通代码中,eval(“var x;”)
将变量x引入周围函数或全局范围。这意味着,一般来说,在包含eval调用的函数中,每个不引用参数或局部变量的名称都必须在运行时映射到特定的定义(因为eval可能引入了一个新变量,该变量将隐藏外部变量)。在严格模式下,eval仅为正在计算的代码创建变量,因此eval不会影响名称是引用外部变量还是引用某个局部变量:

资料来源:


解决方案不是使用jQuery加载脚本,而是向DOM添加
script
元素。注意,您甚至不能使用jQuery来追加元素;它将自动为它使用
$.getScript()

jQuery
eval
评估脚本。“use strict;”inside
eval
更改代码的语义。这就是为什么严格模式可能是危险的!因为在不支持它的浏览器中,您的代码会执行其他操作

其次,严格模式代码的eval不会将新变量引入周围的范围。在普通代码中,eval(“var x;”)将变量x引入周围函数或全局范围。这意味着,一般来说,在包含eval调用的函数中,每个不引用参数或局部变量的名称都必须在运行时映射到特定的定义(因为eval可能引入了一个新变量,该变量将隐藏外部变量)。在严格模式下,eval只为正在计算的代码创建变量,因此eval不会影响名称是引用外部变量还是引用某个局部变量

解决方案是使用
window.foo=“bar;”“
而不是
var foo=“bar”。你应该把你的代码放在生活中,让“严格使用”更容易预测

(function(window) {
    "use strict";

    window.globalVar = {};
    alert(typeof window.globalVar);
}(window));

在执行之前,处理移除严格模式的响应:

 $.ajax({
    url: scriptUrl,
    dataType: "script",
    dataFilter: function (data, type) {
        return data.replace("\'use strict\';", "");
    }
});

你比我快了几秒钟;-)非常有趣。我第一次遇到这个问题,它完全有道理。我的问题是,我需要在加载多个脚本后按顺序执行它们,因此在添加下一个脚本之前,我需要知道脚本何时加载。如果我使用将脚本附加到DOM的方法,是否有办法知道脚本何时加载?.load()行得通吗?这不完全是我需要的,但它让我“点击”-非常感谢!)