我遇到了全局变量的问题。似乎尝试将变量重新声明为局部更改其在整个范围内的值,即使对于以前的用途也是如此。
编辑:问题已修复。这两个功能只显示前后。而我想要解释的是它为什么会改变。
def capture_and_decode(self, bitrange, axes):
cam_width, cam_height = self.camera.resolution
scr_range = self.display.displaywindow.resolution
self.raw_images = numpy.empty((len(axes), cam_height, cam_width, bitrange))
for axis in axes:
for bits in range(0,bitrange):
stripe_width = cam_width // 2 ** (bits + 1)
print(stripe_width)
binary = numpy.fromiter(GrayCode(bits + 1).generate_gray(), dtype=numpy.int) % 2
vector = numpy.repeat(binary, stripe_width)
img = numpy.tile(vector, (cam_height, 1))
self.display.displaywindow.show(img)
time.sleep(0.25)
self.raw_images[axis, :, :, bits] = self.camera.capture()

答案 0 :(得分:3)
通过在var variable
中加入local_var_dec
,您可以使用完全不同的本地变量阴影全局。这意味着全局在local_var_dec
内不可用。由于var
变量已悬挂,因此local_var_dec
中的 不可用,就像它看起来像这样:
function local_var_dec(){
var variable; // ***
console.log("local: "+ variable);
if(typeof variable === 'undefined'){
variable = 2; // ***
}
}
这意味着当您分配给它时,您将分配给本地变量,而不是全局变量;这样做对全局没有影响,这就是为什么当你稍后调用global_var_global
时,你会看到全局的原始价值。
虽然您仍然可以访问全局,但您无法将其作为变量进行访问。像你这样的隐式全局变量(以及在全局范围内用var
声明的变量)是全局对象的属性,因此可以通过全局对象访问,可以在浏览器上以window
访问。因此,window.variable
会在浏览器的local_var_dec
内访问它。在其他环境中,环境定义的全局对象可能有也可能没有全局对象。例如,在NodeJS上,有global
。但是,总是可以从全局范围的this
获取对全局对象的引用(假设环境允许您在全局范围内运行代码;例如,NodeJS不会。)
但是,从根本上说,如果需要访问它们,请避免使用阴影变量,因为全局变量的特征是A)特定于全局变量,B)不是一个好主意,而C)新的let
不可用和const
声明。
这是一个使用window.variable
进行注释并使用// This creates an *implicit global* by assigning
// to an undeclared identifier
variable = 1;
local_var_dec();
global_var_global();
function local_var_dec(){
// This shows `undefined` because `variable` in the below is the *local*
// variable you've declared with `var`, even though the `var` hasn't
// been reached yet. `var` is *hoisted* to the top of the function.
console.log("local: "+ variable);
// This is still the local, so it's still `undefined`
if(typeof variable === 'undefined'){
// This sets the *local* variable to 2; it has no effect at all on
// the global
var variable = 2;
}
// If you wanted, you could use `window.variable` here
console.log("window.variable = " + window.variable);
}
function global_var_global(){
// Because there's no `var` in this function, this us using the global
// `variable`
console.log("global: "+ variable);
if(typeof variable === 'undefined'){
variable = 2;
}
}
进行注释的片段(尽管理想情况下只使用不同的名称):
Nov 23 11:29:37 test kernel: [ 3697.087259] traps: chrome[3794] trap invalid opcode ip:7f4e1a21b699 sp:7ffc8ae3b910 error:0 in chrome[7f4e1914e000+6430000]
Nov 23 11:29:37 test kernel: [ 3697.088518] traps: chrome[3785] trap invalid opcode ip:7fda6a67202d sp:7fff579ef600 error:0 in chrome[7fda6967d000+6430000]
¹隐式全局 - 通过分配而没有任何声明而创建的全局。更多内容发布在我的博文The Horror of Implicit Globals和MDN。
答案 1 :(得分:0)
请更具体地说明您的问题。这显然是Javascript,即使你没有指定这个。你从这个脚本得到什么输出?您使用的是哪种浏览器类型和版本?
关于您的问题: 我希望这个控制台输出:
local: 1
global: 1
原因:两个函数调用中的条件if(typeof variable === 'undefined')
都将为false。考虑函数
function local_var_dec(){
console.log("local: "+ variable);
if(typeof variable === 'undefined'){
var variable = 2;
}
}
之后
除了;如果您在不使用var variable = 2;
的情况下定义全局变量,则此变量实际上是variable
对象的属性,而不是独立的Javascript变量。您也可以将其作为var
来解决,这意味着您可能会因为不使用window
关键字而无意中修改window.variable
属性。
答案 2 :(得分:-1)
从第8行删除var
并将其添加到第一行(但不需要)
var variable = 1; //add `var` here, not needed
local_var_dec();
global_var_global();
function local_var_dec(){
console.log("local: "+ variable);
if(typeof variable === 'undefined'){
variable = 2; //remove `var` from here
}
}
function global_var_global(){
console.log("global: "+ variable);
if(typeof variable === 'undefined'){
variable = 2;
}
}
答案 3 :(得分:-1)
如果您希望全局使用,请不要将变量声明为不带“var”的变量, 在没有“var”的情况下声明它会导致问题。 如果你想在本地使用它可能是你可以做到的,但这不是一个好习惯。 所以解决方案是在变量之前的第一行代码中添加var。 例如:
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
entry: "./entry.js",
output: {
path: __dirname,
filename: "bundle.js"
},
module: {
loaders: [
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract('style', 'raw!sass')
}
]
},
plugins: [
new ExtractTextPlugin('style.css', {
allChunks: true
})
]
};
然后检查输出。
希望它有所帮助< 问候 Shohil