Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用';这';在IIFE构造函数中_Javascript_This_Var - Fatal编程技术网

Javascript 使用';这';在IIFE构造函数中

Javascript 使用';这';在IIFE构造函数中,javascript,this,var,Javascript,This,Var,我正在开发一款小型复古风格的侧滚式太空射击游戏(或者说,这就是理论),最近我开始使用IIFEs来管理我单独的“类” 然而,我看到的大多数示例都倾向于在声明变量时使用var,例如,var x=0。但是我想知道,是否可以使用this.x=0,如果可以,有什么优点或缺点 我试过用谷歌搜索,但找不到太多关于这个主题的信息,这让我觉得这不是问题 我的课程如下 var Player = function () { // ----------------------------------------

我正在开发一款小型复古风格的侧滚式太空射击游戏(或者说,这就是理论),最近我开始使用IIFEs来管理我单独的“类”

然而,我看到的大多数示例都倾向于在声明变量时使用
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
    }
}();
var Player=函数(){
// ------------------------------------------------------------------------------------------------
//玩家变量
// ------------------------------------------------------------------------------------------------
var w=50;
var h=50;
var x=0;
var y=0;
var color='白色';
var射弹=[];
// ------------------------------------------------------------------------------------------------
//将事件绑定到全局画布
// ------------------------------------------------------------------------------------------------
Canvas.bindEvent('mousemove',函数(e){
y=(e.pageY-Canvas.element.getBoundingClientRect().top)-(h/2);
});
Canvas.bindEvent('click',函数(e){
(50,(y+(h/2))-10);
});
// ------------------------------------------------------------------------------------------------
//功能
// ------------------------------------------------------------------------------------------------
var createSproject=函数(x,y){
射弹({
x:x,
y:y
})
};
var update=函数(){
对于(var p=projectles.length-1;p>=0;p--){
射弹[p].x+=10;
if(projectles[p].x>Canvas.element.width)projectles.splice(p,1);
}
};
var render=函数(){
Canvas.context.fillStyle=颜色;
Canvas.context.fillRect(x,y,w,h);
控制台。原木(射弹。长度);
对于(var p=0;p
有什么好处或缺点吗

缺点是,在严格模式下,会出现运行时错误(因为
未定义的

在非严格模式下,
将引用
窗口
,因此
此.x=…
将创建一个全局变量(我想这是您希望在IIFE中首先避免的)

没有好处

有什么好处或缺点吗

缺点是,在严格模式下,会出现运行时错误(因为
未定义的

在非严格模式下,
将引用
窗口
,因此
此.x=…
将创建一个全局变量(我想这是您希望在IIFE中首先避免的)


没有任何好处。

将指向词法范围,主要是非严格模式下的窗口。在严格模式下,
将是
未定义的
@RajaprabhuAravindasamy:
不指向词法范围。你不能在JS中引用作用域(例外:全局作用域和由
语句创建的作用域,因为它们由对象支持)。@FelixKling-Oh谢谢
/“this”值here function test(){///我怎样才能在这个函数之外说出this值?}
我过去常说这是词法范围。我的技术术语快用完了(您的IIFE看起来没有正确声明。它应该是
var Player=(function(){})(;
IIFE只是一个普通的函数调用。请参阅
this
确定值的六种方法。@jfriend00谢谢=)
这将指向词法范围,主要是非严格模式下的窗口。在严格模式下,
将是
未定义的
@RajaprabhuAravindasamy:
不指向词法范围。你不能在JS中引用作用域(例外:全局作用域和由
语句创建的作用域,因为它们由对象支持)。@FelixKling-Oh谢谢
/“this”值here function test(){///我怎样才能在这个函数之外说出this值?}
我过去常说这是词法范围。我的技术术语快用完了(您的IIFE看起来没有正确声明。它应该是
var Player=(function(){})(;
IIFE只是一个普通的函数调用。请参阅
this
确定值的六种方法。@jfriend00谢谢=)谢谢您的回答=)作为一个与“范围”斗争的人,对我来说,这似乎是一种奇怪的行为。作为一个常规构造函数,var player=function(){},
这个
的作用域是player。不过,通过简单地添加()将其转换为iife,可以避免这种全局变量崩溃。这不属于好处吗?@RajaprabhuAravindasamy:问题是在IIFE中使用
this.x=…
是否有好处,而不是IIFE本身的好处。@Lewis:IIFE只是一个函数调用
foo()
newfoo()
是调用函数的两种不同方式。
的值主要由函数的调用方式决定
foo()
bar.foo()<