所包含文件中的函数范围(不是变量)在Javascript和PHP中是否有所不同?

时间:2018-09-13 10:48:58

标签: javascript php function scope jscript

我上个月问a question关于PHP在一个包含文件中调用函数的问题,该文件在后来的包含文件中定义。在将ASP站点转换为PHP时会出现此问题。我现在看到问题再次发生。似乎Javascript和PHP在包含文件中处理函数定义的方式非常不同。

(编辑:我在这里完全是在谈论服务器端脚本,而不是客户端。)

  • 在我的ASP文件(用Java脚本编写)中,当在一个函数之后的一个文件#include d中定义了一个函数,就可以在一个#include d文件中调用该函数。
  • li>
  • 在PHP中,这不起作用。似乎必须在同一文件中或在调用文件的文件include() d中定义一个函数。

这表明Javascript和PHP在操作上有很大的不同,我在任何地方都没有发现过。看来Javascript会在继续执行之前先编译所有包含的文件,而PHP在继续进行下一个包含文件之前会编译并执行每个包含文件。

user-defined functions上的PHP手册页上指出:“在引用函数之前不需要定义它们,除非有条件地定义了函数”。似乎还应该说:“并且除非在不同的include文件中定义和调用了该函数”。 include()的手册页也未解决此问题。

在Javascript中,我必须从战略上考虑在最早的包含文件中定义重要变量,以便可以在需要时使用它们,但是可以在任何包含文件中定义函数并在需要时使用它们。但是在PHP中,似乎我需要在定义函数的地方应用这种战略思维。

似乎,如果我对我在这里写的内容是正确的,那么Javascript和PHP之间的确是一个非常重要的区别,应该之前就已经写过。那我错了,我误会了吗?

1 个答案:

答案 0 :(得分:0)

是的,PHP和Java脚本之间存在很大差异。

在PHP中,函数是一种特殊的东西。功能是全局的;如果某个函数在 somewhere 中曾经被声明过一次,则可以从 wherewhere 中对其进行调用。在运行时执行function foo() ...语句时会声明一个函数(这就是有条件声明的函数有点特殊的原因)。函数具有一个全局唯一名称;您不能重新声明具有相同名称的函数。函数不能像普通值或变量那样对待,例如它们无法被传递。

*这里令人困惑的部分是,function ...声明也可能在解析时被解析和评估 ,这是运行时之前的步骤。在解析步骤中,对无条件函数声明进行评估,从而导致这些函数在“声明它们之前”在运行时可用。对于需要在运行时进行评估的任何事物,例如include语句,那当然是行不通的。


在Javascript函数中,只是分配给变量的值。函数具有与变量相同的作用域规则。函数的行为与普通值相同,例如它们可以像其他任何值一样传递。函数只是可调用值。