局部变量没有变得全球化

时间:2016-10-10 15:37:19

标签: javascript ros

我正在编写一个程序来从飞行控制器获取值,然后使用这些值与HUD进行交互。我面临的问题是我无法从飞行控制器功能中获取变量并将其传递给HUD功能。我试过window没有运气,尝试嵌套功能,以及我在网上找到的其他东西 - 没有一个有效。任何帮助将非常感激。这是代码 -

这是从飞行控制器中提取数据的部分 -

var roll_in;
listenerImu.subscribe(function(message, roll_in) {
    roll_in = (message.twist.linear.x) * (-57.2958);
    return roll_in;
});

将数据放入roll_in后,需要将其放入此函数 -

function FlightIndicator(placeholder, type, options) {
    var attitude = this;
    var settings = $.extend({
        size: 500,
        roll: roll_in, // Vehicle Roll
        pitch: pitch_in, // Vehicle Pitch
        turn: 0,
        heading: 0,
        vario: 0,
        airspeed: 0,
        altitude: 0,
        pressure: 1000,
        showBox: false,
        img_directory: 'jQuery-Flight-Indicators-master/img/'
    },
    options);
}

即使我在console.print(roll_in)函数后面放置listenerImu,也会打印undefined

谢谢!

3 个答案:

答案 0 :(得分:2)

当您在函数中将其声明为参数时,可以在块作用域中重新定义该变量。

var roll_in;  //global
listenerImu.subscribe(function(message, roll_in) {  //creates a new variable here in this block scope
    roll_in = (message.twist.linear.x) * (-57.2958);  //uses the argument, not global
    return roll_in;  //this line appears to do nothing
});

您的代码应该是这个

var roll_in; 
listenerImu.subscribe(function(message) {  
    roll_in = (message.twist.linear.x) * (-57.2958);
});

现在下一个问题是subscribe将是一个异步调用,因此在触发该行之前,变量roll_in将是未定义的。在它之后添加任何console.log()行仍将显示undefined。这就像在网上订购比萨饼一样,在它出现在你家之前你不能吃它。

答案 1 :(得分:0)

    var roll_in;
    listenerImu.subscribe(function(message, roll_in) {
        roll_in = (message.twist.linear.x) * (-57.2958);
           ^ This is the parameter roll_in

只需将roll_in param更改为其他内容。

答案 2 :(得分:0)

如果要将变量分配给外部作用域roll_in,请不要将其作为参数传递给subscribe回调。

var roll_in;
listenerImu.subscribe(function(message) {
    roll_in = (message.twist.linear.x) * (-57.2958);
});

当roll_in用作回调中的参数时,该回调中任何分配的内容都会影响参数变量,不会影响外部作用域的roll_in。