2016-03-29 1 views
0

Я работаю над маленькой ретро-стильной прокруткой космической шутерской игры (или это все равно), и я недавно перешел к использованию IIFE для управления моей отдельной " классы.Использование «Это» в конструкторе IIFE

Однако большинство примеров, которые я видел, имеют тенденцию использовать var при объявлении переменных, например var x = 0. Мне интересно, возможно ли использовать this.x = 0, и если да, есть ли какие-либо выгоды или недостатки?

Я пробовал искать его и не могу найти много на эту тему, что заставляет меня думать, что это не проблема.

Мои классы:

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

'this' будет указывать на лексическую область, в основном окно в нестандартном режиме. В строгом режиме 'this' будет' undefined'. –

+0

@RajaprabhuAravindasamy: 'this' не указывает на * лексический охват *. Вы не можете ссылаться на область действия в JS (исключение: глобальная область и область действия, созданные операторами 'with', поскольку они поддерживаются объектами). –

+0

@FelixKling О, спасибо. '// 'this' значение здесь function test() {// как я могу определить это значение вне этой функции? } 'Я говорил, что это лексическая область. У меня заканчиваются технические термины. :( –

ответ

2

есть какие-либо преимущества или недостатки?

Недостатками является то, что в строгом режиме, вы получите ошибку во время выполнения (потому что this является undefined).
В режиме нестрогого, this будет относиться к window, так this.x = ... создает глобальную переменную (которая является то, что вы хотите, чтобы избежать с IIFE в первую очередь я думаю).

Нет никаких преимуществ.

+0

Спасибо за ваш ответ =) Как человек, который борется с «областью», это кажется мне странным поведением. Как обычный конструктор, var player = function() {}, 'this' будет привязан к игроку. Включение его в iif, хотя, с простым добавлением(), меняет это? – Lewis

+0

Можно избежать глобального аварийного сбоя. Разве это не принесет выгоды? –

+0

@RajaprabhuAravindasamy: Вопрос в том, есть ли какие-либо преимущества использования 'this.x = ...' в IIFE, а не преимущества самих IIFE. –

Смежные вопросы