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