可变范围问题

时间:2016-11-23 12:22:50

标签: javascript variables scope

我遇到了全局变量的问题。似乎尝试将变量重新声明为局部更改其在整个范围内的值,即使对于以前的用途也是如此。

编辑:问题已修复。这两个功能只显示前后。而我想要解释的是它为什么会改变。



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()




4 个答案:

答案 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 GlobalsMDN

答案 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