当前位置: 首页 > 面试题库 >

为什么在JavaScript中定义函数之前就可以使用它?

乜裕
2023-03-14
问题内容

即使在不同的浏览器中,此代码也始终有效:

function fooCheck() {
  alert(internalFoo()); // We are using internalFoo() here...

  return internalFoo(); // And here, even though it has not been defined...

  function internalFoo() { return true; } //...until here!
}

fooCheck();

但是,我找不到关于为什么它应该起作用的单一参考。我首先在John Resig的演示文稿中看到了这一点,但仅被提及。那里或任何地方都没有解释。

有人可以启发我吗?


问题答案:

function声明是魔术,使它的标识符在代码块*中的任何内容执行之前就被绑定了。

这与带有function表达式的赋值不同,后者以正常的自上而下的顺序求值。

如果将示例更改为说:

var internalFoo = function() { return true; };

它将停止工作。

函数声明在语法上与函数表达式完全分开,即使它们看起来几乎相同并且在某些情况下可能是模棱两可的。

这在ECMAScript标准的 10.1.3
节中有说明。不幸的是,即使按照标准标准,ECMA-262也不是一个易读的文档!

*:包含的功能,块,模块或脚本。



 类似资料:
  • 我不明白为什么在Kotlin的类外写函数是可能的?这是个好做法吗?

  • 本文向大家介绍请解释下为什么我们可以在声明函数前使用它?相关面试题,主要包含被问及请解释下为什么我们可以在声明函数前使用它?时的应答技巧和注意事项,需要的朋友参考一下 js 两个特性, 提升变量声明和函数声明,但是注意一点的是 这个是不叫函数声明的, 变量funcName还是会提升,只不过作为一个undefined的变量, 只有 这个叫函数声明,会被提升

  • 问题内容: 我已经看到不同的开发人员在javascript函数中包含分号,而有些还没有。哪个是最佳做法? 要么 问题答案: 分号后 函数的声明 是 没有必要的 。 a的语法在规范中描述为: 语法上没有分号,但可能想知道为什么? 分号用于将 语句 彼此分开,并且a 不是 语句 。 在代码执行之前进行评估,是用来解释这种行为的 常用词 。 术语“函数声明”和“函数声明”通常会错误地互换使用,因为ECM

  • 我没有在我的中设置,但是我可以使用和! 我的如下所示: 如果我想安装其他版本的JDK,比如11、14、15.…,我该如何使用它呢?我需要设置吗?

  • 问题内容: 在严格模式下使用javascript时,为什么在匿名函数中未定义此函数?我知道为什么这样做可能有意义,但是我找不到任何具体答案。 例: 问题答案: 这是因为,在ECMAscript 262第5版之前,如果使用的人忘记使用该关键字,那会造成很大的混乱。如果在ES3中调用构造函数时忘了使用,请引用全局对象(在浏览器中),然后用变量破坏全局对象。 这是可怕的行为等人在ECMA决定,只是为了集

  • 问题内容: 我更喜欢将OOP用于目前正在从事的大型项目中。我需要用JavaScript创建几个类,但是,如果我没记错的话,至少有两种方法可以做到这一点。语法是什么,为什么要用这种方式呢? 我想避免使用第三方库-至少在一开始。 在寻找其他答案时,我找到了文章“ _[使用JavaScript进行面向对象的编程”,第I部分:继承文档JavaScript ,该文章讨论了JavaScript中的面向对象的编