2013-11-23 21 views
14

J öğreniyorum ve bir örnekle karşılaşıyorum ||Neden kullanmalı || değişken fonksiyon beyanında?

var Triangulation = Triangulation || (function() { 
... 

var zaten atamadan önce ilan edilmiştir olmadığını görmek için kontrol edilir geliyor bana: bir fonksiyonu olarak bir var bildirirken kullanılır. Web'in etrafına baktığımda, bu yaklaşımın kullanıldığı başka örnekler göremiyorum. Ne vs bu yaklaşım için bir neden olacaktır: Bu triangulation değişken zaten henüz ise, triangulation değişken döner kendisi eğer tanımlanmış değil tanımlanmış bir şans var demektir

var Triangulation = function() { 
... 

teşekkür

+4

Muhtemelen bir kez ve yalnızca bir kez ayarlamanın bir yolu mu? – Sico

+0

bunu kontrol edin ... http: //stackoverflow.com/questions/2100758/javascript-or-variable-assignment-explanation – nik

+0

'var Üçgenleme = Üçgenleme || (function() {'sadece ** 'nin Trianglulation'ın bu adıma gelmeden önce bildirilmiş olması anlamına geldiğini belirtir, ardından bu adımı atlayın. ** else ** işlev içindeki kodu yürütün {} . –

cevap

19

- - anonim işlev triangulation yeni değişkeni için değer döndürecektir.

Ve önemli/hassas olan şey var. Bu zor bir iş. Örneğin:

<script> 
var triangulation = function(){return(1);}; 
</script> 

Aslında şu anlama gelir:

<script> 
window.triangulation = function(){return(1);};// because "triangulation" is in global      
               // namespace and "var" in this case 
               // means nothing "local", as you may expect 
</script> 

Yakın zaman, başlatma var triangulation = ... genel değişkeni üzerine yazar.

var triangulation = triangulation || function(){...}; 
+7

Bu şablonun ortak kullanımı "ad alanları" oluşturduğunuzdadır. Örneğin, aşağıdakileri tanımlayabilirsiniz: $ = $ || {}; $ .app = $ .app || {}; $ .app.something = $ .app.something || {}; Daha sonra, ad alanlarınızın tanımlandığından ve tanımlarınızın birbirinin içine girmediğinden emin olmak için her dosyanın üstüne aynı temel öğeleri ekleyebilirsiniz. –

2

Triangulation o Short-circuiting kullanarak yeni bir değer atamadan önce varsa bu kontrol eder: Eğer bunu korumak istiyorsanız, size yazmak zorunda. Bu, tarayıcılardan tarayıcılara farklılık gösteren bir özelliği desteklemek istediğinizde yaygın bir uygulamadır.

Bir örnek requestAnimationFrame'dur. Her tarayıcı farklı satıcı öneki gerektirdiğinden, değişkene doğru yöntemi atamak için || kullanıyoruz, böylece tüm tarayıcıları destekliyoruz.

window.requestAnimFrame = (function(){ 
    return window.requestAnimationFrame  || 
      window.webkitRequestAnimationFrame || 
      window.mozRequestAnimationFrame || 
      function(callback){ 
      window.setTimeout(callback, 1000/60); 
      }; 
})(); 

//whatever exists will be assigned to window.requestAnimFrame . 
1

Bu genellikle mutlaka dosya yükleme sırasını bilmek (veya yönetmek isteyen) yok onların uygulamaları birden fazla dosya bölünmüş halde isim alanlı paketler için kullanılır. Genellikle, bu yapardın: Senin durumunda

var Namespace = Namespace || {} 

o önceden tanımlanmış eğer Triangulation sınıfını yeniden atama önlemek için sadece.

2

For || Operatör, JS Örneğin truthy değeri
değerlendirmek birinci ifade değerini verir:
bir || B (varsayarak bir boş dize ve B, bir tam sayı (12)), yukarıdaki sentezleme 12 döndürür
(yani doğruluk değerini değerlendiren ilk ifade.

Senaryoda, Üçgenliğin zaten bildirilmiş olup olmadığını kontrol ediyoruz, o zaman fonksiyon ifadesini hesaplamamız ve onu Üçgenleme'ye atamamız gerekiyor.
var Triangulation = Triangulation || (Function() {

-1

biz & & (ve benzeri JavaScript kullanmış operatörler) || (veya) ve! (Değil) operatörlerin birkaç türü vardır. Bu operatörler olarak da bilinir

bir süre ya da başka kontrol beyanı.

|| operatörü belirlemek için kullanılır, eğer Mantıksal operatörler.

Mantıksal operatörler çoğunlukla program akışını denetlemek için kullanılır . Genellikle, bir parçası olarak bunları bulacaksınız

koşullardan herhangi birinin doğru olup olmadığı

Örnek:

(x == 5 || Y == 5) { .... .... }

teşekkür ederiz.

+0

'un soruyla ilgisi yoktur. – oligofren