不完整的可执行自加载闭包

Incomplete executable self-loading closures

本文关键字:加载 闭包 可执行      更新时间:2023-09-26

浏览器/ajax/javascript是否可以自动完成,并在自加载闭包打开时关闭它们

1 (function()
2 {
3 function a(n){this.name=n;}
4 var a=this;
5 //more code in here
6 alert(a);
7 //})();

- The terminating brace and parens were not present in the script i saw
- Is it possible that it must be generated dynamically, so that the .js file
- does not contain it but the script/ajax later appends it ..?
- Can the browser complete it..?

为什么不运行一些简单的测试?

使用以下文件:

<script>
(function a () {
    alert('a');
</script>
<script>
$(function() { alert('b'); a(); });
</script>

这将告诉您以下场景:

  1. alerts('a'(,alerts('b'(,alerts('a''(===>(不太可能(:浏览器完成了功能定义并编写了执行parens 的闭包

  2. 警报('b'(,警报('a'(===>浏览器完成了功能定义,调用按预期进行

  3. alerts('b'(,为未定义的a抛出错误((===浏览器忽略了完整的函数定义

  4. 什么都不做===>浏览器在找不到右大括号后退出解析

我认为浏览器不太可能添加闭包的执行部分,但也不会添加缺失的末尾}。尽管这绝对不是你想要依赖的行为,并且应该始终很好地形成你的脚本文件。

有可能吗是的。或者不。这取决于你准备接受的假设。

当前浏览器中发生这种情况吗据我所知,虽然我从未尝试过。

这是个好主意吗不。至少,在我看来不是。我想不出我为什么想要这个。你能进一步解释一下为什么会这样做吗?

举个你发布的例子:

1 (function()
2 {
3 function a(n){this.name=n;}
4 var a=this;
5 //more code in here
6 alert(a);
7 //})();

因此,浏览器看到有一个函数表达式没有关闭的}),并且由于像这样的函数表达式实际上不会对末尾的();位做任何事情,因此浏览器应该假设这是有意的,并且也这样做?好的,现在,它应该在哪行添加它?如果在第2行、第3行、第4行、第5行或第6行之后添加,它将是有效的可执行代码。在我看来,添加缺少的右括号最合乎逻辑的地方是在第3行和第4行之间,因为这样var a声明就不会与function a定义冲突。你想让浏览器解决这类问题吗?

浏览器是否应该在"贪婪"的基础上工作,并在外部功能中尽可能多地包含?尽可能少?因为你可以打赌IE会变得"贪婪",FF会变得最小,Chrome会在另一个页面上搜索一个类似但完整的脚本,并使用完整的脚本代替,Opera只会将其报告为错误而不运行。