2016-03-29 5 views
0

私は小さなレトロスタイルのサイドスクロールスペースシューティングゲーム(またはそれはとにかく理論です)に取り組んでいます。最近、私の別の 'クラス'。IIFEのコンストラクタ内で 'This'を使用する

しかし、私が見た例のほとんどは、変数を宣言するときに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'はレキシカルスコープを指します。ほとんどは非厳密モードのウィンドウです。 strictモードでは 'this'は' undefined'になります。 –

+0

@RajaprabhuAravindasamy: 'this'は* lexical scope *を指しません。 JS内でスコープを参照することはできません(例外:グローバルスコープと 'with'ステートメントによって作成されたスコープはオブジェクトによってサポートされているため)。 –

+0

@FelixKlingありがとうございます。 '// 'this' value here function test(){//この関数の外でこの値をどのように伝えることができますか? } '私はそれがレキシカルスコープであることを伝えていました。私は専門用語を使い果たしています。 :( –

答えて

2

任意の利点や欠点がありますか?

の欠点は、(thisundefinedあるので)strictモードで、あなたはランタイムエラーを取得することです。 非厳密モード
thiswindowを参照しますので、this.x = ...は、(あなたは私が推測する最初の場所で生命維持に避けたいものです)グローバル変数を作成します。

利点はありません。

+0

あなたの答えをありがとう=)「範囲」と闘う人として、これは私にとっては奇妙な行動のようです。通常のコンストラクタとして、var player = function(){}、 'this'はプレーヤーにスコープされます。しかし、それを人に見せても、()の単純な追加によって、これは変わるのですか? – Lewis

+0

グローバル変数のクラッシュを回避できます。それは利益の下に来ませんか? –

+0

@RajaprabhuAravindasamy:問題は、IIFE自体の利点ではなく、IIFEで 'this.x = ...'を使うことのメリットがあるかどうかです。 –

関連する問題