如果我在全局范围内声明一个属性(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声明相同的属性,则代码不起作用,控制台显示意外令牌。
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
不会创建新的全局变量,它会在 vbo
变量上创建一个 itemSize
属性,并将值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
和全局itemSize
(窗口是全局范围)