Javascript 在定义第一个函数之前在另一个函数中使用该函数

Javascript 在定义第一个函数之前在另一个函数中使用该函数,javascript,function,hoisting,Javascript,Function,Hoisting,在编写API时,我倾向于将函数按自上而下的顺序排列,最公开的函数位于顶部,辅助函数位于底部。但是,当使用var而不是magic函数delcaration定义函数时,函数在定义之前不能使用。那么,如果我们有一个名为$company的对象,并且我们正在定义它的方法呢。我可以安全地以这种方式订购JS吗 var $company = {}; $company.foo = function(x) { $company.bar(x*x); // used in definition, but no

在编写API时,我倾向于将函数按自上而下的顺序排列,最公开的函数位于顶部,辅助函数位于底部。但是,当使用
var
而不是magic
函数
delcaration定义函数时,函数在定义之前不能使用。那么,如果我们有一个名为
$company
的对象,并且我们正在定义它的方法呢。我可以安全地以这种方式订购JS吗

var $company = {};

$company.foo = function(x) {
    $company.bar(x*x); // used in definition, but not called directly - ok?
};

// $company.bar(6) // this would produce an error

$company.bar = function(x) {
    alert(x);
};
它似乎在我当前版本的Firefox中起作用,但我想知道它是否定义了行为。是否有任何版本的IE出现这种情况?

是的,您可以

函数只定义,不执行

JS引擎执行文件的每一行:


稍后,在执行时,
$company.foo
定义了
$company.bar

是的,这是因为没有浏览器(或JavaScript引擎)对
右侧的内容进行假设,直到它必须对左侧的表达式求值

但许多人不喜欢这种“前瞻”,而是使用回调函数:

 $company.foo = function(x, callback) {
      callback(x*x);
 }

这段代码更明显、更灵活,因为它几乎可以调用任何东西,您可以调用它,等等。

JS将在您调用它时使用您的函数,因此当您声明foo时,bar可能不存在,但在调用foo时它应该存在。谢谢。但是我不确定它是否明确地依赖于
,因为下面的代码也不会产生错误:
var a=function(){b();};var b=函数(){alert(1);}这里有两个效果:JavaScript将解析函数体(检查语法错误),但它不会对各个位的含义做出很多假设。因此,在某种意义上,函数体和
的情况是相同的:只要语法正确,JavaScript就不关心(现在)函数体/右侧是否有意义。这是有意义的。但是我在任何地方都找不到它的明确写法。作为参考答案的作者和一个长期的javascript黑客,我可以告诉你一些关于javascript/ECMAscript规范是如何编写的。首先是Netscape的实现(只有代码,没有规范),然后微软尽可能地复制它(包括bug),然后人们决定应该有一个标准(主要是因为担心微软会将他们的js引擎发展成与其他人100%不兼容)。这一过程一直延续到今天,苹果发明的特性成为了一种称为HTML5的“标准”,微软发明的语法成为SVG的一部分等等。也许正因为如此,javascript规范实际上是一种尽可能详细地记录javascript当前实现的尝试(标准委员会不能同意的部分除外). 因此,浏览器恰好具有完全兼容的行为的许多部分被忽略了,因为它们是显而易见的,并且没有记录在案。在过去,我们必须编写测试脚本来弄清楚js是如何工作的(尤其是在IE中,因为我们没有访问源代码的权限),如果上述所有内容听起来有点吓人(用一种你无法完全了解的语言编写代码),那就真的很可怕了。非常非常可怕。哈,我刚刚读了你的一些其他答案你的答案写得很好,我想我现在明白了。谢谢你的评论!
 $company.foo = function(x, callback) {
      callback(x*x);
 }