Разница между тем, как php и javascript выполняют вложенную функцию - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь представить, как javascript и php обрабатывают вложенные функции.

Дело в следующем:

php :

b(); //CANNOT call b at this point because isn't defined yet
a(); //CAN call a at this point because the interpreter see the declar
b(); //ok now i can call b, because the interpreter see the declaration after a execution
function a(){
    function b(){
        echo "inner";
    }
}

между тем в javascript :

b(); //CANNOT call b isn't defined yet
a(); //CAN call a at this point because the interpreter see the declar

function a(){
    function b(){
        console.log("inner");
    }
}
a(); //ok now i can call a because is defined
b(); // **CANNOT** call b yet !!   

почему в javascript я не могу вызвать b (), даже если выполняется a? в чем PHP действуют иначе?

Спасибо заранее!

1 Ответ

1 голос
/ 25 июня 2019

Это предметная область.Вы могли бы так же легко - в javascript - написать "var b = function ()".«b» - это просто переменная типа function, определенная в рамках функции a.В PHP и «a», и «b» являются глобальными функциями, но задача «a» - определить «b», поэтому он не будет определен до тех пор, пока не будет вызван «a».Рассмотрим этот пример ...

function a($x) {
    if ($x) {
        function b() { echo "x not empty"; }
    } else {
        function b() { echo "x empty"; }
    }
}
a(1);    // Defines function b
b();     // x not empty
a(0);    // PHP Fatal error:  Cannot redeclare b() (previously declared...

Если вы не смогли переопределить "b", вы можете увидеть, что "b" - это настоящая функция с глобальной областью действия.Функция «а» может использовать различные критерии для определения функции для конкретной цели в разных прогонах.Понятно, что в этом случае не имеет смысла вызывать функцию «b» до того, как функция «a» решит, как ее определить.

Кстати, я не думаю, что приведенный выше примерочень хорошая практика кодирования, но она служит иллюстрацией.

PHP-код, наиболее похожий на ваш код javascript:

function a() {
    $b = function() {
            echo "'b' says inner";
         };
    $b();    // Demonstrating the function can be used inside "a"
}
a();    // 'b' says inner

$ b - это переменная типа function,который может использоваться только внутри функции "a".

...