Javascript 回调中未定义的变量

Javascript 回调中未定义的变量,javascript,cordova-plugins,Javascript,Cordova Plugins,我对Cordova插件的回调有一个问题,如下代码所示: function foo(param) { setTimeout(function(){ console.log("In:", param); }, 1000); console.log("Out:", param); } foo(1); 在这个例子中,我通过一个简单的超时来假装插件回调调用 预期结果是: Out: 1 In: 1 但我面临的问题是,在我的实际应用程序中,使用真正的插件回调(

我对Cordova插件的回调有一个问题,如下代码所示:

function foo(param) {
    setTimeout(function(){ 
        console.log("In:", param);
    }, 1000);

    console.log("Out:", param);
}

foo(1);
在这个例子中,我通过一个简单的超时来假装插件回调调用

预期结果是:

Out: 1
In: 1
但我面临的问题是,在我的实际应用程序中,使用真正的插件回调(不是超时),回调函数中的函数参数值有时是未定义的,就像在前面的示例中,结果是:

Out: 1
In: undefined
这有意义吗?是否存在变量(函数参数)在闭包中不再可用的情况

是否存在变量(函数参数)在闭包中不再可用的情况

是的,如果您通过指定另一个值(例如,
未定义
)来更改闭包范围中的参数,请参见示例:

function foo(param) {

    setTimeout(function() {
        console.log("In:", param);
    }, 1000);

    // some function that returns 'undefined'
    var someFunction = function() {
        return undefined;
    };

    console.log("Out:", param);

    param = someFunction(); // or simply assign to 'undefined'
}

foo(1);
输出:

Out: 1
In: undefined

你能分享这些情景吗?确保不接受参数作为回调参数,如
setTimeout(函数(param)){…
这太大了,它们是从不同的点多次调用的回调,其中一些来自本机。无论如何,我重构了我的代码,这个问题不再发生。只是好奇可能会发生什么。你是对的,但在我的情况下,我可以保证在退出函数范围时变量有一个值(本例中为
foo
),因为我正在使用
console.log