2016-03-29 15 views
0

Küçük retro tarzı bir yan kaydırma alanı shooter oyunu üzerinde çalışıyorum (ya da yine de bu teori budur) ve son zamanlarda ayrı birimin yönetimi için IIFE'leri kullanmaya başladım. sınıflar. Ancak, gördüğüm örneklerin çoğu, değişkenleri bildirirken var'u kullanma eğilimindedir, E.g, var x = 0. Yine de merak ediyorum, this.x = 0 kullanmak mümkün mü ve eğer varsa, herhangi bir yarar veya dezavantajları var mı?IIFE kurucudaki 'This' i kullanma

Konuyla uğraşmayı denedim ve konuyla ilgili fazla bir şey bulamadım. Bu da sorun olmadığını düşünmemi sağlıyor.

Sınıflarım aşağıdaki gibidir;

var Player = function() { 
    // ------------------------------------------------------------------------------------------------ 
    // PLAYER VARIABLES 
    // ------------------------------------------------------------------------------------------------ 
    var w = 50; 
    var h = 50; 
    var x = 0; 
    var y = 0; 
    var color = 'white'; 
    var projectiles = []; 

    // ------------------------------------------------------------------------------------------------ 
    // BIND EVENTS TO THE GLOBAL CANVAS 
    // ------------------------------------------------------------------------------------------------ 
    Canvas.bindEvent('mousemove', function(e){ 
     y = (e.pageY - Canvas.element.getBoundingClientRect().top) - (h/2); 
    }); 

    Canvas.bindEvent('click', function(e){ 
     createProjectile(50, (y + (h/2)) - 10); 
    }); 

    // ------------------------------------------------------------------------------------------------ 
    // FUNCTIONS 
    // ------------------------------------------------------------------------------------------------ 
    var createProjectile = function(x, y){ 
     projectiles.push({ 
      x: x, 
      y: y 
     }) 
    }; 

    var update = function(){ 
     for(var p = projectiles.length - 1; p >= 0; p--){ 
      projectiles[p].x += 10; 

      if(projectiles[p].x > Canvas.element.width)projectiles.splice(p, 1); 
     } 
    }; 

    var render = function() { 
     Canvas.context.fillStyle = color; 
     Canvas.context.fillRect(x, y, w, h); 
     console.log(projectiles.length); 

     for(var p = 0; p < projectiles.length; p++){ 
      Canvas.context.fillStyle = 'red'; 
      Canvas.context.fillRect(projectiles[p].x, projectiles[p].y, 20, 20); 
     } 
    }; 

    // ------------------------------------------------------------------------------------------------ 
    // Exposed Variables and Functions 
    // ------------------------------------------------------------------------------------------------ 
    return{ 
     update: update, 
     render: render 
    } 
}(); 
+0

'Bu, katı olmayan modda çoğunlukla pencere olan sözcük kapsamını gösterecektir. Katı modda 'bu' undefined' olacaktır. –

+0

@RajaprabhuAravindasamy: "bu" kelimesinin * kapsamı değil. JS'deki kapsamı referans gösteremezsiniz (istisna: '' 'ifadeleri tarafından oluşturulan global kapsam ve kapsam, nesneler tarafından desteklendikleri için). –

+0

@FelixKling Oh teşekkür ederim. '//' this 'value here işlev testi() {// bu değerin bu işlev dışında nasıl anlatabilirim? } 'Bunun sözcük kapsamı olduğunu söylerdim. Teknik terimlerim tükeniyor. :( –

cevap

2

herhangi yararları veya dezavantajları vardır?

dezavantajları (thisundefined olduğu için) Katı modda yılında, bir çalışma zamanı hatası alacak vardır. olmayan Katı modda, this, window sevk edecektir olarak
böylece this.x = ... (sanırım ilk etapta hayatından ile kaçınmak istediğini olan) global bir değişken oluşturur.

Hiçbir yararı yoktur.

+0

Cevabınız için teşekkürler =) 'Kapsam' ile mücadele eden biri olarak, bu bana garip davranış gibi görünüyor. Düzenli bir kurucu olarak, var player = function() {}, 'bu' oyuncuya dağıtılacaktır. Bununla birlikte, basit bir() ilavesiyle bunu bir canlıya dönüştürmek, bunu değiştirir mi? – Lewis

+0

Küresel değişken çökme önlenebilir. Bunun faydaları altında değil mi? –

+0

@RajaprabhuAravindasamy: Soru, IIFE'lerin kendi yararları değil, II.x = ... 'yi kullanmanın yararları olup olmadığıdır. –