如果我在全局范围内声明了一个属性(在我的情况下为itemSize),而没有单词var,则代码有效

var vbo = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,vbo);
gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(vertices),gl.STATIC_DRAW);
vbo.itemSize = 3;//This line works


如果我用var这个词声明了相同的属性,则该代码将不起作用,并且控制台会显示Unexpected token。

var vbo = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,vbo);
gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(vertices),gl.STATIC_DRAW);
var vbo.itemSize = 3; //Unexpected token "."


而如果我在函数中声明vbo.itemsize,它将再次起作用。为什么不能在全局范围内将属性设置为var?该属性不应该读取为window.vbo.itemsize吗?

最佳答案

您可以,问题是您声明了vbo并为其itemSize属性分配了一个值,这导致解释器尝试声明一个名为vbo.itemSize的变量。由于无法声明名称中带有句点的变量,因此会出现指定的错误。此代码:

vbo.itemSize = 3;//This line works


不会创建新的全局变量,而是在itemSize变量上创建vbo属性,并为其分配值3,这是完全合法的,并且与vbo变量的范围无关。变种

var vbo.itemSize = 3; //Unexpected token "."


也是多余的,因为已经声明了vbo变量。您还可以通过执行以下操作将值分配给vbo.itemSize和全局itemSize

var itemSize = vbo.itemSize = 3


如果要在除全局范围之外的其他地方执行此操作,请执行

window['itemSize'] = vbo.itemSize = 3


可以将3正确分配给和全局vbo.itemSize(窗口是全局范围)

07-24 16:12