Куда возвращается возвращаемая функция, если она где-то не хранится? - PullRequest
0 голосов
/ 27 января 2019

Куда возвращается возвращаемая функция, если она где-то не хранится?Разве это не должно быть добавлено к глобальному объекту / текущему внешнему контексту?Вот пример:

var setup = function(){
    console.log("xyz");
    return function goBack(){
        console.log("It's actually abc");
    }
}

Теперь при вызове setup () в глобальной области видимости в консоли отображается «xyz», но функция возврата, т. Е. GoBack, не добавляется в глобальную область видимости..

setup() //Outputs "xyz"

Теперь, при попытке вызвать goBack, он не определен в глобальной области видимости:

goBack() //error: goBack not defined

Теперь я могу получить доступ к goBack с помощью setUp () () или сохранением возвращенной функции.из настройки () в глобальную переменную.Но разве я не смогу получить доступ к goBack из глобальной области видимости после выполнения setup ()?Потому что, если бы я сохранил setup () в глобальной переменной, у меня был бы доступ к goBack через эту переменную.Но что произойдет, если я не использую переменную для хранения возвращенной функции из setup ()?Куда точно возвращается goBack?Спасибо.

Ответы [ 5 ]

0 голосов
/ 27 января 2019

Я бы сказал, что вы не можете выполнить функцию goBack из-за лексической области действия: https://stackoverflow.com/a/1047491/1836175 не замыкания: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures.

Если вы хотите выполнить функцию goBack, потому что она возвращается setup(), вам просто нужно сохранить возвращение функции setup. Javascript имеет функции первого класса: https://developer.mozilla.org/en-US/docs/Glossary/First-class_Function

Таким образом, код для возможности выполнения функции goBack позже будет:

var later = setup()
// do whatever you want and when needed 
later() // -> will call the goBack function

Надеюсь, это поможет прояснить, что это такое:).

PS: и так, да, если не хранить, функция будет собирать мусор (см. Ответ на deceze).

0 голосов
/ 27 января 2019

Просто добавьте к ответу deceze - добавление в глобальную область, как правило, плохо, поэтому язык не делает этого, если вы действительно этого не хотите.

Пример. Предположим, у вас большое приложение с большим количеством компонентных битов, и многие из этих компонентных битов возвращают функцию при вызове. Теперь вы должны убедиться, что каждый компонент использует свое имя для своей функции, в противном случае вы можете перезаписать чужой глобал, что было бы плохо. И если вы используете библиотеку javascript, вам нужно убедиться, что вы не используете одно и то же имя с библиотекой, потому что тогда вы можете нарушить их код.

Хранение содержимого в области очень важно, а хранение содержимого в глобальном масштабе - это хороший способ выявить ошибки, которые действительно трудно исправить.

0 голосов
/ 27 января 2019

Если вы не сохраните ее в переменной, она будет собрана мусором, когда вернется функция setup, и вы больше не сможете получить к ней доступ. С другой стороны, вы можете написать свою функцию настройки следующим образом:

var setup = function(){
    console.log("xyz");

    window.goBack = function(){
        console.log("It's actually abc");
    }
}

и функция goBack доступна в глобальной области видимости.

тогда вы получите к нему доступ через window.goBack() или просто goBack()

0 голосов
/ 27 января 2019

На самом деле вы возвращаете объект, который можно сохранить в переменной и затем запустить, или вы также можете запустить его напрямую.

    function a(){
    console.log("a");
    return function b(){
    console.log("b");
    };
    }
    console.log("this is calling just a");
    a();
    console.log("this is calling the a and the returned object");
    a()();
0 голосов
/ 27 января 2019

Вы возвращаете функциональный объект , который совпадает с любым другим типом объекта или любым другим типом значения. Если вы ничего не назначаете, это просто выходит из области видимости и будет собирать мусор. С этим ничего не происходит.

...