在IIFE构造函数中使用'This'

时间:2016-03-29 16:11:22

标签: javascript this var

我正在制作一个小型复古风格的横向滚动太空射击游戏(或者,无论如何这是理论),我最近转向使用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
    }
}();

1 个答案:

答案 0 :(得分:2)

  

有任何好处或缺点吗?

缺点是在严格模式中,您将收到运行时错误(因为thisundefined)。
非严格模式中,this将引用window,因此this.x = ...会创建一个全局变量(这是您希望避免使用IIFE的全局变量我猜的第一个地方。

没有任何好处。