"(Function () { }) ()" и "(function () { } ())" функционально равны в JavaScript?
Оба из этих блоков кода ниже оповещения foo
затем bar
, Единственная разница })()
а также }())
,
Код 1:
(function()
{
bar = 'bar';
alert('foo');
})();
alert(bar);
Код 2:
(function()
{
bar = 'bar';
alert('foo');
}());
alert(bar);
Так есть ли разница, кроме синтаксиса?
3 ответа
Нет; они одинаковые
Однако, если вы добавите new
заранее и .something
потом они будут другими.
Код 1
new (function() {
this.prop = 4;
}) ().prop;
Этот код создает новый экземпляр класса этой функции, а затем получает prop
свойство нового экземпляра.
Возвращается 4
,
Это эквивалентно
function MyClass() {
this.prop = 4;
}
new MyClass().prop;
Код 2
new ( function() {
return { Class: function() { } };
}() ).Class;
Этот код вызывает new
на Class
имущество.
Так как скобки для вызова функции находятся внутри внешнего набора скобок, они не подхватываются new
выражение, и вместо этого вызовите функцию нормально, возвращая ее возвращаемое значение.new
выражение анализируется до .Class
и создает это. (скобки после new
необязательны)
Это эквивалентно
var namespace = { Class: function() { } };
function getNamespace() { return namespace; }
new ( getNamespace() ).Class;
//Or,
new namespace.Class;
Без скобок вокруг вызова getNamespace()
, это будет проанализировано как (new getNamespace()).Class
- это вызвало бы getNamespace
класс и вернуть Class
свойство нового экземпляра.
Нет никакой разницы - открывающая фигурная скобка служит только синтаксической подсказкой, сообщающей парсеру, что ниже следует выражение функции вместо объявления функции.
Там нет разницы. Оба являются функциональными выражениями.
Есть и третий путь:
+function() {
bar = 'bar';
alert('foo');
}();
(вместо +
другой оператор тоже будет работать)
Самый распространенный способ
(function() {
// ...
})();
хоть.