- Во-первых, вам нужно знать, что такое IIFE (немедленно вызывается выражение функции). Как следует из названия, IIFE вы можете вызывать функцию сразу после объявления. Но JS парсер должен видеть целое как одно выражение.
Пример.
(function(){console.log("foo")}())
!function(){console.log("foo")}()
+function(){console.log("foo")}()
Все это заставляет синтаксический анализатор видеть сторону function(){console.log("foo")}()
как полное выражение, чтобы он мог немедленно вызвать.
- Во-вторых, как работает
new (Foo.bar())()
.
При использовании new (Foo.bar())()
в первых скобках возвращается this
, что само по себе Foo
. Потому что bar
метод возвращает Foo
. После вторых скобок ()
вызывает его (Foo), а затем new
создает новый экземпляр Foo
. В основном вы пишете new Foo()
с использованием IIEF.
- В-третьих, почему
new Foo.bar()()
выдает ошибку.
Когда JS синтаксический анализатор видит выражение new Foo.bar()
, это немедленно попробуйте создать экземпляр, если Foo.bar
и Foo.bar
не является конструктором. После этого JS выдает эту ошибку.
Но если парсер видит ()
, он может выдать еще одну ошибку, Uncaught SyntaxError: Unexpected token ')'
. Поскольку JS не может понять, что осталось от этой строки, ()
.
Разница между
new Foo.bar()()
и new (Foo.bar())()
такая же, как
function(){console.log("foo")}()
и (function(){console.log("foo")})()
он вызывает другую ошибку и прекращает синтаксический анализ, потому что Foo.bar
не является конструктором для вызова.
Надеюсь, это поможет.
Некоторые ссылки для понимания. Что делает восклицательный знак перед функцией?