【问题标题】:Why is 'Use Strict' causing functions to be undefined为什么“使用严格”导致函数未定义
【发布时间】:2015-07-10 16:35:13
【问题描述】:

我有一个正在加载两个脚本的部分。第二个脚本调用第一个脚本中的一个函数......两个脚本都使用“use strict;”在顶部。当第二个脚本调用第一个脚本中的函数时,我收到“Uncaught ReferenceError 函数名未定义”。

起初我认为这与脚本的顺序有关,但经过一些调试后,我发现脚本以正确的顺序执行。部分加载通过 jquery 异步调用并仅附加到当前视图。另外,我可以在 chrome 的调试器中调用第一个脚本的函数,直到第二个文件被加载。

我有点发疯了,只是砍掉了所有东西,但它仍在发生。这是我正在使用的...

脚本 1

"use strict";

var firstScript = function () {
    alert("first");
};

脚本 2

"use strict";

var secondScript = function () {
    alert("second");
};

Ajax 调用

$.ajax({
    type: "post",
    url: "/../SomeController/SomeAction",
    success: function (content) {
        $("#someDiv").html(content);
    }
});

部分

<script src="~/Some/Folder/Js/Script1.js"></script>
<script src="~/Some/Folder/Js/Script2.js"></script>

页面加载后,我打开 chrome 调试器并执行“firstScript()”或“secondScript()”会引发相同的错误。

但是,如果我在两个文件上都去掉use strict;,它们都可以工作。这里到底发生了什么?

【问题讨论】:

  • 真的是那些脚本文件的完整内容吗?
  • 它们的顺序是否正确? IE。你在包含之前打电话给secondScript吗?
  • 我正在使用它与 asp.net 来获取实际内容
  • @Pointy 是的,我实际上是从我的文件中复制并粘贴了该部分:|
  • @EBrown 现在我什至没有在脚本中调用它。我只是触发这个事件来加载脚本,然后只是试图从 chrome 的调试器控制台调用它。就像,如果我使用“使用脚本”,这些函数就不是全局函数列表的一部分,但我找不到任何关于“使用脚本”的东西可以防止这种情况发生。同样,如果我删除两个文件中的“使用脚本”,效果会很好。

标签: javascript use-strict


【解决方案1】:

阅读 Barmar 的评论后,再深入一点。部分中包含的任何标签都由jquery's globalEval 函数评估,该函数当然使用eval() 我的脚本有"use strict";"use strict"; 的功能之一是防止eval() 影响全局范围,这这就是我得到未定义函数的原因。

【讨论】:

  • 谁知道呢,最有可能在自动驾驶中进行大脑打字:P
猜你喜欢
  • 2012-10-27
  • 2017-12-04
  • 2017-10-31
  • 2018-12-31
  • 2018-08-17
  • 1970-01-01
  • 2018-05-31
相关资源
最近更新 更多