Parênteses em IIFE em JavaScript

Geralmente, ao invocar uma função imediatamente, em vez de um sinal de mais, são usados parênteses, pois essa forma de escrita é considerada mais óbvia:

javascript(function() {
  console.log('!');
}());

Na maioria das vezes, os parênteses de chamada de função são colocados por fora, assim:

javascript(function() {
  console.log('!');
})();
Задание 1

Determine, sem executar o código, o que será exibido no console:

javascriptlet result = (function() {
  return '!';
}());

console.log(result);
Задание 2

Determine, sem executar o código, o que será exibido no console:

javascriptlet result = (function() {
  return '!';
})();

console.log(result);
Задание 3

Determine, sem executar o código, o que será exibido no console:

javascriptlet result = (function() {
  return '!';
});

console.log(result);
Задание 4

Determine, sem executar o código, o que será exibido no console:

javascriptlet result = (function() {
  return '!';
});

console.log(result());