如何引用类对象?Player类实例化与数组批量添加的代码疑问
我定义了这样的Player类:
class Player{ constructor(id,name){ this.id=id; this.name=name; } }我知道可以用
var player = new Player(1,'Mike')实例化,并用点表示法访问属性。现在我想通过循环生成多个Player实例并添加到数组里,写了部分代码:let player =[]; player.push( playerName = new Player(id,playerName));请问在
playerName前添加var关键字的写法是否正确?会产生什么影响?
先直接给你明确结论:直接在push的参数里加var是语法错误,但如果把var放在合适的位置声明变量,写法是合法的,不过会有作用域相关的影响,下面详细拆解:
1. 错误的写法:在push参数内加var
如果你写成这样:
let player =[]; player.push(var playerName = new Player(id,playerName));
浏览器或Node.js会直接抛出SyntaxError——因为var是用来声明变量的语句,不能作为表达式出现在函数参数、赋值操作这类场景里,JavaScript引擎根本无法解析这种写法。
2. 合法的写法:用var单独声明变量
如果调整写法,把var用来单独声明playerName(比如在循环内部),代码是合法的:
// 建议把数组名改成players,避免和Player类/实例混淆 let players = []; for (let i = 0; i < 3; i++) { var playerName = new Player(i, `Player_${i}`); players.push(playerName); }
但要注意var的特性带来的影响:
var是函数级作用域,不是块级作用域。如果这段代码在函数内部,playerName会被提升到函数的顶部;如果在全局作用域,它会直接变成全局变量(挂载到window/global对象上)。- 循环的每一次迭代都会覆盖
playerName的值,但这不会影响数组里的实例——因为数组保存的是对象的引用地址,和playerName变量后续的赋值无关,数组里的实例依然是独立的。
3. 对比你原来不加var的写法
你原来的代码player.push(playerName = new Player(id,playerName)),在非严格模式下会隐式创建全局变量playerName,这会污染全局作用域——如果其他代码里也用到了同名变量,很容易出现变量被意外覆盖的bug。
如果开启了严格模式(在代码顶部加'use strict'),这种未声明就赋值的写法会直接抛出ReferenceError,因为严格模式禁止隐式创建全局变量。
更推荐的优化写法
如果只是临时用来保存实例再push,其实完全可以不用额外变量,直接把实例push到数组里:
let players = []; for (let i = 0; i < 3; i++) { players.push(new Player(i, `Player_${i}`)); }
如果确实需要临时变量,建议用let代替var——let是块级作用域,只会在当前循环迭代的块内生效,不会提升到外部作用域,安全性更高:
let players = []; for (let i = 0; i < 3; i++) { let playerName = new Player(i, `Player_${i}`); players.push(playerName); }
内容的提问来源于stack exchange,提问作者KT-mongo

