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