为啥“使用严格”导致函数未定义

Posted

技术标签:

【中文标题】为啥“使用严格”导致函数未定义【英文标题】: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 的调试器控制台调用它。就像,如果我使用“使用脚本”,这些函数就不是全局函数列表的一部分,但我找不到任何关于“使用脚本”的东西可以防止这种情况发生。同样,如果我删除两个文件中的“使用脚本”,效果会很好。 【参考方案1】:

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

【讨论】:

谁知道呢,最有可能在自动驾驶中进行大脑打字:P

以上是关于为啥“使用严格”导致函数未定义的主要内容,如果未能解决你的问题,请参考以下文章

使用严格会导致未定义的功能

为啥应用程序组件中的服务注入导致 URL 参数未定义?

为啥在函数体内定义的内置类型的未初始化对象具有未定义的值?

为啥这个异步函数返回未定义? [复制]

为啥调用未定义函数时没有 PHP 错误?

收到“未定义无参数构造函数”错误,不知道为啥