Según a lo que entendí es que (function(w){})(window); y !(function(w){})(window); hacen lo mismo ya que ! transforma la funcion en una expresion:
Pero estuve provando en la consola del navegador obteniendo esto:
Código:
(function(){console.log('Hello');})();
Hello
undefined
!function(){console.log('Hello');}();
Hello
true
!(function(){console.log('Hello');})();
Hello
true
+(function(){console.log('Hello');})();
Hello
NaN
+(function(par){console.log(par);})('hola');
hola
NaN
Cada uno tiene como segunda respuesta que difieren entre si. Cual es la utilidad