5

假设我有以下脚本,名为include_strict.js. 执行后我应该window.global1定义:

"use strict";

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

但是,如果我从一个 javascript 块中包含它

$.getScript("include_strict.js");

警报说undefined。为什么?这里发生了什么?

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

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

在这里,我看到了预期的警报,object。如果我删除"use strict";,那么两者都jQuery.getScript()具有<script>;相同的显示效果object

我创建了一个示例(https://docs.google.com/file/d/0B-XXu97sL1Ckb0x0OHptTmVMY00/edit)来演示这一点。

4

3 回答 3

11

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

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

来源:https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode

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

于 2012-10-08T06:43:42.117 回答
2

jQueryeval使用脚本。“使用严格;” insideeval改变了代码的语义。这就是为什么严格模式可能很危险!因为在不支持它的浏览器中,您的代码会执行其他操作。

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

https://developer.mozilla.org/en/JavaScript/Strict_mode

解决方案是使用window.foo = "bar;"而不是var foo = "bar";. 你应该把你的代码放在一个 IIFE 中,以使“使用严格;” 更可预测。

(function(window) {
    "use strict";

    window.globalVar = {};
    alert(typeof window.globalVar);
}(window));
于 2012-10-08T06:43:45.093 回答
0

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

 $.ajax({
    url: scriptUrl,
    dataType: "script",
    dataFilter: function (data, type) {
        return data.replace("\'use strict\';", "");
    }
});
于 2016-11-02T09:01:32.737 回答