script标签函数作用域的问题

新手上路,请多包涵
    <!--  1.js
        function print() {
            console.log(a)
        }
    -->
    <script src="./1.js"></script>
    
    <script>
        console.log('body', a) // 报错
    </script>
    
    <!--  2.js~~~~
        let a = 1
        function b() {
            console.log(a)
            print() // 输出 1
        }
        b() // 输出 1
    -->
    <script src="./2.js"></script>

代码如上,我的问题是为什么定义在后面的(2.js)的变量a能在1.js中使用,而同样是在2.js之前的script标签中使用a就会报错,显然script标签使用src引入和不使用src是不同的,但是什么原因导致的,为什么会这样?

其次我在1.js中输出了window对象,发现属性中有2.js中的b函数,但是直接调用window.b却会报错,提示不存在这个属性,这又是为什么?

阅读 4.7k
3 个回答

使用不使用src是一样的,只不过把代码分片段,但是是外部链接js脚本导致前面的script无法使用后面script定义的变量或者方法
定义在2.js里的a能在1中使用是因为print执行延后了,你直接在1中执行print,a也是未定义也会抛出ReferenceError
1.js中window对象中含有b方法是因为对象是索引数据,你点击扩展的时候b已经被加到window对象中了。但是你提前使用的时候还没有b这个方法,所以就报错了,undefined不能直接当方法执行

新手上路,请多包涵

结合答案又研究了一下

  1. script标签的作用域是一体的
  2. 这一个问题需要结合变量提升
  3. 所以结合1、2实际上运行的时候代码是这样
        let a
        function print() {
            console.log(a)
        }
        function b() {
            console.log(a)
            print() // 输出 1
        }
        a = 1
        b()

<script>的作用域是相同的 所以代码如下

 function print() {
        console.log(a)
  }
 console.log('body', a)//let声明会把变量提升到作用域的暂时性死区所以报错
 let a = 1
        function b() {
            console.log(a)
            print() // 输出 1
        }
   b()//执行函数时let a已经声明并赋值(js代码从上往下执行) 所以打印1
        
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题