多个script代码块执行问题(猜测)

假设页面有两个script标签:

<script>
throw new Error(‘error‘)
</script>

<script>
console.log(1)
</script>

  在运行的时候 我们发现1是会正常输出的,再看下一段代码:

<script>
console.log(a)
</script>

<script>
var a = 1;
</script>

我们发现这个时候输出的a并不是undefined,而是保存:a is not defined,

所以我猜测:

因为我们知道浏览器遇到script脚本 会停止dom解析和css解析,专注于解析js,所以这个时候浏览器不会做其他任何事情,现在浏览器解析到第一个script标签,他开始解析这段代码,如果这段代码报错了,则浏览器抛出错误,并认为该段script解析完毕,然后浏览器则继续开始查找dom元素 解析dom元素,这个时候浏览器又遇到第二段script块,然后继续开始解析,所以 第一段script的报错 并不会影响第二段script的执行。

浏览器在解析文档的时候,并没有提前将页面上的所有的script标签,提前收集起来 做统一处理,而是根据遇到则解析的 规则来解析,所以我们看到 即使js存在命名提升,因为在解析第一段script的时候,第二段script还没有执行,所以也就不存在命名提升

我们再看一段代码:

<script>
var a = 1;
</script>

<script>
console.log(a)
</script>

  这个时候输出1,这表明 多个script块 是共享同一个作用域的,也就是window顶级作用域。

原文地址:https://www.cnblogs.com/mrzhu/p/11773827.html

时间: 2024-10-19 12:33:21

多个script代码块执行问题(猜测)的相关文章

java基础复习一、代码块执行顺序

1 /** 2 * 代码块执行顺序的测试 3 * 执行顺序 静态代码块>main代码块>构造代码块>构造函数>普通代码块 4 * @author Administrator 5 * 6 */ 7 public class ClassDemo01 { 8 static { 9 System.out.println("这是一个静态代码块"); 10 } 11 { 12 System.out.println("这是一个构造代码块"); 13 } 1

java静态成员变量,静态代码块执行测试

Java  类对象 静态成员变量,静态代码块加载执行顺序. package com.yjm.pro; import java.io.IOException; import java.util.Properties; public class Pro {  public static String url;  public static String username;  public static String password;  public static String classforna

Java中普通代码块,构造代码块,静态代码块执行顺序

执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. static块,普通代码块,构造代码块执行顺序 class A{ public A(){ System.out.println("Hello A"); } { System.out.println("block A"); } static{ System.out.println("static A

修饰符-包-内部类-代码块执行顺序

1.访问权限修饰符     从大到小的顺序为:public--protected--default--private     private--只能在同一类中使用;     default--不用写出来,默认不加.可以被同一包中的类使用     protected--可以被不同包的子类使用     public--可以被不同包的其它类使用 2.各种修饰符的修饰对象(可修饰哪些:类/接口/方法/属性)(多个修饰符连用是可以没有顺序的!)     1)访问权限修饰符:public/default--

代码块执行顺序。

class Father1{ static{ System.out.println("....static Father....."); } { System.out.println(".....父类非静态..."); } public Father1(){ System.out.println("---父类构造方法----"); }} class Son1 extends Father1{ static{ System.out.println(

Java static 静态代码块执行分析

假设有这样一个类: public class Utils { static { Log.i("static","isLoad!"); } public static void staticCode(){ } public int value; public void noStaticCode(){ } } 在整个程序运行起来时,何时加载这个静态代码块呢?1.当实例化该类时.列:new Utils():2.当调用该类静态方法时.列:Utils.staticCode()

Java--普通代码块静态代码块执行顺序

1 class B { 2 3 public B() { 4 super(); 5 System.out.println("构造器B"); 6 } 7 { 8 System.out.println("普通的代码块B"); 9 } 10 static{ 11 System.out.println("静态代码块B"); 12 } 13 14 } 15 public class ClassA extends B { 16 17 public Class

java代码块执行顺序

1.测试类 public class Demo extends SuperDemo { //静态代码块 static{ System.out.println("this is static block"); } //普通代码块 { System.out.println("this is normal block"); } //默认构造函数 public Demo(){ System.out.println("this is demo constructor

08-02 Java 代码块,代码块执行的先后顺序问题

代码块 /* 代码块:在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期. 构造代码块:在类中的成员位置,用{}括起来的代码.每次调用构造方法执行前,都会先执行构造代码块. 作用:可以把多个构造方法中的共同代码放到一起,对对象进行初始化. 静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰了. 作用:一般是对类进行初始化. 面试题? 静态代码块,构造代码块,构造方法的执行顺序? 静态代码块 -