!function () {}();
!function () {}();
Yanıtlar:
JavaScript sözdizimi 101. İşte bir işlev bildirimi :
function foo() {}
Noktalı virgül olmadığını unutmayın: bu yalnızca bir işlev bildirimidir . foo()
İşlevi gerçekten çalıştırmak için bir çağrıştırmaya ihtiyacınız vardır .
Şimdi, görünüşte zararsız bir ünlem işareti eklediğimizde: !function foo() {}
bunu bir ifadeye dönüştürüyor . Artık bir işlev ifadesidir .
!
Tek başına elbette fonksiyonu çağırmak değil, ama şimdi koyabilirsiniz ()
sonunda: !function foo() {}()
daha yüksek önceliğe sahiptir !
ve anında işlevini çağırır.
Yani yazarın yaptığı her fonksiyon ifadesi başına bir bayt kaydetmek; daha okunabilir bir şekilde yazılması şöyle olur:
(function(){})();
Son olarak, !
ifadeyi doğru yapar. Bunun nedeni, varsayılan olarak undefined
, bizi bırakan tüm IIFE dönüşlerinin !undefined
olmasıdır true
. Özellikle yararlı değil.
!
boolean döndürür, hepimiz biliyoruz, ancak yaptığınız en büyük nokta, işlev bildirim deyimini bir işlev ifadesine dönüştürmesi ve böylece işlevin parantez içine alınmadan hemen çağrılmasıdır. Açık değil ve açıkça kodlayıcının amacı.
var foo =
ifade / ifade belirsizliğini bozar ve yazabilirsiniz var foo = function(bar){}("baz");
vb.
İşlev:
function () {}
hiçbir şey döndürmez (veya tanımsız).
Bazen bir işlevi yarattığımız gibi çağırmak isteriz. Bunu denemek cazip olabilir:
function () {}()
ancak a SyntaxError
.
Kullanılması !
fonksiyonu bir ifadesi olarak tedavi edilecek bunu neden daha önce bu yüzden biz onu çağırabilir, operatörünü:
!function () {}()
Bu aynı zamanda bu durumda, fonksiyonun dönüş değerinin boolean tersini dönecektir true
, çünkü !undefined
olduğunu true
. Gerçek dönüş değerinin çağrının sonucu olmasını istiyorsanız, bu şekilde yapmayı deneyin:
(function () {})()
!
, işlev bildirimini bir işlev ifadesine dönüştürmektir, hepsi bu.
!function
sözdizimini kullanır
Airbnb JavaScript rehberinde!
işaretlenmiş işlev çağırma için iyi bir nokta var
Genel olarak bu tekniği daha sonra birleştirilecek ayrı dosyalarda (aka modüller) kullanma fikri. Buradaki uyarı, yeni dosyayı yeni satıra yerleştiren araçlarla birleştirilmesi gereken dosyalardır (bu, zaten birçok concat aracının ortak davranışıdır). Bu durumda, !
daha önce birleştirilmiş modül sondaki noktalı virgül özlediyse, hatadan kaçınmaya yardımcı olur ve yine de bunları endişelenmeden herhangi bir sıraya koyma esnekliği verir.
!function abc(){}();
!function bca(){}();
İle aynı şekilde çalışacaktır
!function abc(){}();
(function bca(){})();
ancak bir karakteri kaydeder ve keyfi olarak daha iyi görünür.
Ve bu arada herhangi biri tarafından +
, -
, ~
, void
onlar farklı hareket edeceğini işlevinden dönmek için bir şey kullanmak zorunda eğer operatörleri kesin, fonksiyonu çağıran açısından, aynı etkiye sahiptir.
abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?
ancak bir dosya için bir modül kod ayırma için IIFE kalıpları kullanıyorsanız ve optimizasyon için concat aracını (bir satır bir dosya işi yapan) kullanıyorsanız, o zaman inşaat
!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()
İlk kod örneğinde olduğu gibi güvenli kod yürütme işlemini gerçekleştirir.
Bu hata JavaScript ASI işini yapamaz neden olur hata atar.
!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()
Tekli operatörlerle ilgili bir not, benzer işler yapacaklardı, ancak sadece durumda, ilk modülde kullanmamışlardı. Bu yüzden, birleştirme sırası üzerinde tam kontrole sahip değilseniz, o kadar güvenli değildir.
Bu çalışıyor:
!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()
Bu değil:
^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()
İfadenin false olarak değerlendirilip değerlendirilemeyeceğini döndürür. Örneğin:
!false // true
!true // false
!isValid() // is not valid
Bir değeri boole değerine zorlamak için iki kez kullanabilirsiniz:
!!1 // true
!!0 // false
Sorunuzu daha doğrudan yanıtlamak için:
var myVar = !function(){ return false; }(); // myVar contains true
Düzenle: İşlev bildirimini bir işlev ifadesine değiştirmenin yan etkisi vardır. Örneğin, aşağıdaki kod geçerli değildir, çünkü gerekli tanımlayıcıyı (veya işlev adını ) içermeyen bir işlev bildirimi olarak yorumlanır :
function () { return false; }(); // syntax error
var myVar = !function(){ return false; }()
atlayabilir ve işlev doğru şekilde yürütülür ve dönüş değerine dokunulmaz. !
var myVar = function(){ return false; }()
true
ile !0
ve false
ile !1
. 2 veya 3 karakter kaydeder.
Javascript küçültme yaparken sadece bir bayt veri kaydetmek içindir.
aşağıdaki anonim işlevi göz önünde bulundurun
function (){}
Yukarıdakileri kendi kendini çağırma fonksiyonu olarak yapmak için genellikle yukarıdaki kodu şu şekilde değiştireceğiz:
(function (){}())
Şimdi fonksiyonu çağırmak için gerekli olan fonksiyonun sonuna (,)
eklemek dışında iki ekstra karakter ekledik ()
. Küçültme sürecinde genellikle dosya boyutunu küçültmeye odaklanırız. Böylece yukarıdaki işlevi de yazabiliriz
!function (){}()
Yine de her ikisi de kendi kendini çağıran işlevlerdir ve biz de bir bayt tasarruf ediyoruz. 2 karakter yerine (,)
sadece bir karakter kullandık!
! mantıklı bir NOT işleci, bir şeyi tersine çevirecek bir boolean işleci.
İşlevden önce BANG (!) Kullanarak çağrılan işlevin parantezlerini atlayabilmenize rağmen , yine de istediğinizi döndürmeyecek şekilde dönüşü tersine çevirecektir. Bir IEFE örneğinde olduğu gibi, tersine çevrildiğinde boole gerçeği haline gelen tanımsız dönecektir .
Bunun yerine, gerekirse kapanış parantezini ve BANG'ı ( ! ) Kullanın .
// I'm going to leave the closing () in all examples as invoking the function with just ! and () takes away from what's happening.
(function(){ return false; }());
=> false
!(function(){ return false; }());
=> true
!!(function(){ return false; }());
=> false
!!!(function(){ return false; }());
=> true
Çalışan Diğer Operatörler ...
+(function(){ return false; }());
=> 0
-(function(){ return false; }());
=> -0
~(function(){ return false; }());
=> -1
Kombine Operatörler ...
+!(function(){ return false; }());
=> 1
-!(function(){ return false; }());
=> -1
!+(function(){ return false; }());
=> true
!-(function(){ return false; }());
=> true
~!(function(){ return false; }());
=> -2
~!!(function(){ return false; }());
=> -1
+~(function(){ return false; }());
+> -1
Ünlem işareti herhangi bir işlevin her zaman bir boole döndürmesini sağlar.
Son değer, işlev tarafından döndürülen değerin reddedilmesidir.
!function bool() { return false; }() // true
!function bool() { return true; }() // false
Atlanması !
Yukarıdaki örneklerde, bir olacaktır SyntaxError .
function bool() { return true; }() // SyntaxError
Ancak, bunu başarmanın daha iyi bir yolu:
(function bool() { return true; })() // true
!
çalışma zamanının işlevi ayrıştırma biçimini değiştirir. Çalışma zamanının işleve bir işlev ifadesi gibi davranmasını sağlar (bir bildirim değil). Bunu, geliştiricinin ()
sözdizimini kullanarak işlevi hemen çağırmasını sağlamak için yapar . !
işlev ifadesini çağırmanın sonucuna da kendisini (yani olumsuzlama) uygulayacaktır.
IIFE (hemen çağrılmış fonksiyon ifadesi) yazmanın başka bir yolu.
Diğer yazı biçimi -
(function( args ) {})()
ile aynı
!function ( args ) {}();
(function (args) {...})()
sözdizimini tercih eder ve bu !function
formu küçültme ve gizleme araçlarına bırakırım .
!
sonuç olarak beklediğiniz her şeyi reddeder (tersine), yani
var boy = true;
undefined
boy
true
!boy
false
aradığınızda boy
, sonucunuz olur true
, ancak !
aramayı eklediğiniz an boy
, yani !boy
sonucunuz olur false
. Başka bir deyişle NotBoy'u kastediyorsunuz , ama bu sefer temelde boolean bir sonuç ya true
da false
.
!function () {}();
İfadede olanla aynı şey, sadece koşmak function () {}();
size bir hata işaretleyecek, ancak ifadenizin !
tam önüne ekleyecek function () {}();
, bunu function () {}();
size geri dönecek olanın tersi yapıyor true
. Örnek aşağıda görülebilir:
function () {}();
SyntaxError: function statement requires a name
!function () {}();
true