Javascript 如何访问promise中的函数参数

Javascript 如何访问promise中的函数参数,javascript,function,scope,Javascript,Function,Scope,我有以下功能: var makeNewContextMenu = function( metadata, $toggle, $after){ dataStore.getCollaboration(metadata._mountTarget).then(function(data){ //need to access metadata, $toggle and $after inside promise }) } 在我的承诺内,如何访问元数据、$toggle和$aft

我有以下功能:

var makeNewContextMenu = function( metadata, $toggle, $after){
    dataStore.getCollaboration(metadata._mountTarget).then(function(data){
      //need to access metadata, $toggle and $after inside promise
    })
}

在我的承诺内,如何访问元数据、$toggle和$after

您可以完全按照代码所示使用它们。父作用域中的变量或参数可用于内联函数,如
.then()
处理程序

var makeNewContextMenu = function( metadata, $toggle, $after){
    dataStore.getCollaboration(metadata._mountTarget).then(function(data){
       // this works!
       console.log(metadata);
       console.log($toggle);
       console.log($after);
    })
}
无法访问父作用域中定义的变量或参数的唯一原因是,如果某个介入作用域定义了同名的变量或参数。在这种情况下,距离您较近的范围具有优先权,且较高范围的变量被具有相同名称的较近范围的变量“隐藏”,如果不将其重命名为不具有相同名称,则无法访问较高范围的变量。但是,你的情况并非如此


在您的评论中,您询问了如何获取包含
元数据
$toggle
$after
数据
的返回值。由于
dataStore.getCollaboration()
是异步的,这意味着它的响应在将来某个时候可用,但是
makeNewContextMenu()
会立即返回,因此不能从
makeNewContextMenu()
直接返回
数据。但是,您可以返回一个承诺,并使所需的数据成为承诺的履行值,如下所示:

var makeNewContextMenu = function( metadata, $toggle, $after){
    return dataStore.getCollaboration(metadata._mountTarget).then(function(data){
       return {
           metadata: metadata,
           $toggle: $toggle,
           $after: $after,
           data: data
       };
    })
}

makeNewContextMenu(...).then(function(info) {
    console.log(info.metadata);
    console.log(info.$toggle);
    console.log(info.$after);
    console.log(info.data);
});

注意,您确实不必在这个返回的数据结构中放置
元数据
$toggle
$after
,因为它们是作为参数传递给
makeNewContextMenu()
的,所以它们已经在调用
makeNewContextMenu()
的范围内可用。您可以直接在那里引用它们,并使用它们的原始变量。

太棒了!谢谢你的快速回复。作为后续问题,当我调用makeNewContextMenu时,如何才能返回{metadata,$toggle,$after,data}?@user5844628-从何处返回它们?比如我调用makeNewContextMenu。如何让makeNewContextMenu返回{metadata,$toggle,$after,data}作为output@user5844628-假设
dataStore.getCollaboration()
是异步的,则不能<当
makeNewContextMenu()
返回时,代码>数据
还不可用。它将在
dataStore.getCollaboration()
调用其回调之前返回,因此
data
还未知。您可以返还承诺并使用返还承诺。我会在我的答案中加上如何做到这一点。你可能想看看