在javascript中,只有前面的函数调用';在同一个脚本标记中定义的

在javascript中,只有前面的函数调用';在同一个脚本标记中定义的,javascript,Javascript,//场景1 <script> myFunction(); // This won't work. </script> <script> function myFunction() { alert("ok"); } </script> myFunction();//这行不通。 函数myFunction(){ 警报(“正常”); } //场景2 <script> myFunction(); // This will wor

//场景1

<script>
myFunction(); // This won't work.
</script>

<script>
function myFunction() {
    alert("ok");
}
</script>

myFunction();//这行不通。
函数myFunction(){
警报(“正常”);
}

//场景2

<script>
myFunction(); // This will work.
function myFunction() {
    alert("ok");
}
</script>

myFunction();//这会奏效的。
函数myFunction(){
警报(“正常”);
}

为什么??谢谢你的帮助

在JavaScript中,脚本按照它们在页面上出现的顺序加载,并被阻塞。因为您将它们放在单独的脚本标记中,所以它们是单独加载的。第一个被加载,方法在没有定义的情况下被执行。在第二个示例中,方法定义和调用同时加载,这意味着调用方法时方法确实存在。

页面找到的每个脚本标记都将执行它

所以第一个脚本运行myFunction(),但它不在那里,错误

对于第二个,myFunction在那里,所以OK

但请注意,以下也是错误:

<script>
    myFunction(); // error
    var myFunction = function() {
        alert("ok");
    }
</script>
名为
myFunction
的函数将在类似pre-process的过程中创建,这将完成一些初始工作。
然后是运行时,它处理
myFunction()
。现在,当调用它时,有一个名为的函数,没有问题。

在考虑第二个脚本标记之前,将解析并执行整个第一个脚本标记。作为解析脚本的一部分,函数声明会提前被识别,这就是为什么第二个声明可以工作而第一个不能工作的原因

JavaScript:最终指南

出现在和标记之间的JavaScript语句按出现顺序执行;当一个文件中出现多个脚本时,脚本将按其出现的顺序执行。如果脚本调用document.write(),则传递给该方法的任何文本都会在结束标记之后立即插入到文档中,并在脚本完成运行时由HTML解析器进行解析。相同的规则适用于包含在具有src属性的单独文件中的脚本


Javascript是客户端剪切语言。当网页加载时,浏览器会检查网页中所有可用的syntex和函数

  • 如果您在一个
    标记内定义函数,并从另一个
    标记调用函数,则浏览器将仅在第一个
    标记内进行检查
  • 如果您想从任何脚本标记调用函数,请将该函数放入js文件中,并在html页面中使用它

拉杰什·卡卡瓦特的回答似乎与我观察到的一致,但我没有看到弗拉纳根的书《JavaScript:The Financial Guide》(JavaScript:The Financial Guide)或其他地方直接提到这个问题

js被一起读取和“编译”(在页面的html中有上面的脚本标记),并逐个脚本标记执行脚本标记-一次一个脚本标记-使用上面所有脚本标记(而不是页面的html中下面的脚本标记)中的所有定义等在页面上连续执行

这似乎是正在发生的事情:

  • 读取当前脚本标记w js chunk(整个脚本标记)
  • 与当前脚本标记上方所有先前处理的脚本标记合并并“编译/解释”
  • 在当前脚本标记下执行所有js
  • 通过当前脚本标记(document.write)处理任何结果html输出
  • 解析向下移动到下面的下一个脚本标记的html,如果点击下面的另一个脚本标记,则返回到步骤1

  • 这意味着,如果函数在下面的脚本标记中定义(尚未处理)并在当前脚本标记中调用,则会发生“'function x'undefined”错误,因为js解释器还不知道它。但是,在给定的脚本标记中,可以在列表中的调用下面定义一个函数,其工作方式与在列表中定义的相同。

    js是客户端脚本,因此当加载页面时,它会执行。@SatishSharma:这完全是个混淆——无论如何,如果这是一个答案,请将其作为一个答案发布(注释不是为了回答问题)。场景1您正在调用一个函数,浏览器试图在脚本标记中获取函数声明,但它不在那里…因此在页面加载时出现错误。“当您使用var定义myFunction时,它现在是一个局部变量”.No,这里myFunction是一个全局变量。@user3184459。是的,因为这里它的局部作用域实际上是全局的,所以这里它实际上是一个全局变量。谢谢
    <script>
        myFunction(); // OK
        function myFunction() {
            alert("ok");
        }
    </script>