Вы можете использовать их точно так, как показывает ваш код. Переменные или аргументы из родительской области доступны встроенной функции, такой как ваш обработчик .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);
})
}
Единственная причина, вы не могли бы быть в состоянии получить доступ к переменной или аргументом, определенный в родительской области, если некоторые промежуточные сфера определяет переменную или аргумент того же имени. В этом случае область действия, которая ближе к вам, имеет приоритет, а переменная с более высокой областью видимости «скрыта» с помощью переменной с более узкой областью с тем же именем, а переменная с более высокой областью не будет доступна без переименования, чтобы не иметь то же имя. Но это не то, что происходит в вашем случае.
В своем комментарии, вы спросили, как получить возвращаемое значение, которое включает metadata
, $toggle
, $after
и data
. Потому что dataStore.getCollaboration()
является асинхронным, что означает, что его ответ доступен когда-то в будущем, но makeNewContextMenu()
немедленно возвращается, вы не можете напрямую вернуть data
от 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);
});
Примечание, вы действительно не должны поставить metadata
, $toggle
и $after
в этом возвращаемой структуры данных, поскольку они были переданы в качестве аргументов makeNewContextMenu()
, поэтому они уже доступны в области, в которой был вызван makeNewContextMenu()
. Вы можете просто прямо ссылаться на них там и использовать свои исходные переменные.
Возможно, вы захотите прочитать [Как работают блокировки JavaScript?] (Http://stackoverflow.com/q/111102/218196) –