【问题标题】:Difference between how php and javascript execute a nested functionphp和javascript执行嵌套函数的区别
【发布时间】:2019-11-06 12:58:55
【问题描述】:

我试图想象一下 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 中即使执行了 a 也不能调用 b()?在什么 PHP 行为不同?

提前致谢!

【问题讨论】:

  • 即使语法看起来相似,这两种语言也完全不同。 JS 是原型,与 PHP 有不同的作用域规则。
  • JavaScript 有严格的词法作用域。在函数内声明的任何符号都是该函数(及其词法后代)私有的。对于letconst,这也适用于简单的块。

标签: javascript php function nested-function


【解决方案1】:

这是一个范围的事情。您可以很容易地 - 在 javascript 中 - 编写“var b = function()”。 “b”只是在函数a范围内定义的函数类型变量。在 PHP 中,“a”和“b”都是全局函数,但定义“b”是函数“a”的工作,所以在调用“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”是一个真正的、全局作用域的函数。函数“a”可以使用各种标准在不同的运行中为特定目的定义函数。显然,在这种情况下,在函数“a”决定如何定义它之前调用函数“b”是没有意义的。

顺便说一下,我不认为上面的例子是很好的编码实践,但它确实可以说明这一点。

与您的 javascript 代码最相似的 PHP 代码是:

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

$b 是函数类型的变量,只能在函数“a”中使用。

【讨论】:

  • 好的,谢谢!我的问题的重点是关于内部功能范围的区别和解释器在这方面的作用!现在更清楚了!
  • @artas 为什么语言是它们的本来面目,这往往成为一种存在主义的讨论。如果你回到它的根源,你可以更好地理解 javascript。谷歌“语法糖和 javascript”,你会发现很多现代 javascript 就是这样。没有它,javascript 编写起来就会变得不那么有趣,阅读起来也变得更加困难,但你确实会更深入地了解它在做什么。 PHP 是,嗯,PHP - 没有特别的押韵或理由来解释为什么它在一个函数中的大海捞针和在另一个函数中的大海捞针。你只需要学习这一切......
  • 谢谢你的回答!是的,我知道,但我的问题不是关于“为什么”,而是关于“范围如何”不同。特别是 php 和 javascript 在处理另一个函数中的函数定义方面有何不同!
猜你喜欢
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
相关资源
最近更新 更多