Неполные исполняемые самозагрузочные замыкания - PullRequest
0 голосов
/ 04 июля 2011

Можно ли браузерам / 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..?

Ответы [ 2 ]

1 голос
/ 04 июля 2011

Возможно ли это? Да.Или нет. В зависимости от того, какие предположения вы готовы принять.

Это происходит в текущих браузерах? Не знаю, хотя я никогда не пробовалэто.

Это хорошая идея? Нет. По крайней мере, на мой взгляд.Я не могу придумать причину, почему я хотел бы этого.Можете ли вы объяснить, почему вы хотели бы?

Возьмите только тот пример, который вы опубликовали:

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, потому что таким образом *Объявление 1022 * не будет конфликтовать с определением function a.Вы хотите, чтобы браузер уладил подобные вещи?

Должен ли браузер работать на «жадной» основе и включать как можно больше во внешнюю функцию?Как можно меньше?Поскольку вы могли бы поспорить, что IE будет «жадным», FF будет минимальным, Chrome будет выполнять веб-поиск, чтобы найти похожий, но полный сценарий на другой странице, и вместо этого использовать полный, а Opera просто сообщит об этом как об ошибке ине запускайте его.

1 голос
/ 04 июля 2011

Почему бы не запустить несколько простых тестов?

Используйте несколько таких файлов:

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

Это скажет вам следующие сценарии:

  1. оповещения ('a'), оповещения ('b'), оповещения ('a') ==> (маловероятно): определение функции завершено браузером и записано закрытие при выполнении паренов

  2. оповещения ('b'), оповещения ('a') ==> определение функции браузера завершено, и вызовы прошли, как и ожидалось

  3. alerts ('b'), выдает ошибку для неопределенного a () ==> браузер проигнорировал неполное определение функции

  4. ничего не делает ==> браузер завершил разбор после того, как не нашел закрывающую скобку

Я думаю, что очень маловероятно, что браузер добавит исполняющую часть замыкания, но не менее вероятно, что он добавит в отсутствующий конец}. Хотя это определенно не то поведение, на которое вы хотите рассчитывать, и оно всегда должно формировать ваши файлы скриптов.

...