JavaScript有关作用域和预解析

作用域:使用范围

全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用

除了函数以外,其他的任何位置定义的变量都是全局变量

局部变量:在函数内部定义的变量,是局部变量,外面不能使用

全局变量,如果页面不关闭,那么就不会释放,就会占空间,消耗内存

全局作用域:全局变量的使用范围

局部作用域:局部变量的使用范围

块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在js中在这个块级作用域中定义的变量,外面也能使用;

说明:js没有块级作用域,只有函数除外。

隐式全局变量:声明的变量没有var,就叫隐式全局变量

全局变量是不能被删除的,隐式全局变量是可以被删除的

定义变量使用var是不会被删除的,没有var是可以删除的

函数体的局部变量,外部无法访问,但是隐式全局变量可以被访问

<script>
    function f1() {
        var number=100;
    }
    f1();
    console.log(number);//Uncaught ReferenceError: number is not defined

    function f1() {
        number=1000;
    }
    f1();
    console.log(number);//1000
</script>

隐式全局变量可以被删除,全局变量不能被删除

<script>
var num=10;
delete  num;
console.log(num);//10
num2=20;
delete num2;
console.log(num2);//Uncaught ReferenceError: num2 is not defined
</script>

作用域链:

  <script>
    var num=10;
    function f1() {
      var num=20;
      function f2() {
        var num=30;
        function f3() {
          var num=50;
          console.log(num);//50
        }
        f3();
      }
      f2();
    }
    f1();
  </script>

如果注释掉var num=50; 则会向外部作用域寻找num变量

<script>
    var num = 10;

    function f1() {
        var num = 20;

        function f2() {
            var num = 30;

            function f3() {
                //var num=50;
                console.log(num);//30
            }

            f3();
        }

        f2();
    }

    f1();
</script>

有关预解析:

 预解析:提前解析代码
 预解析:发生在解析代码之前
 预解析做什么事?
 把变量的声明提前了----提前到当前所在的作用域的最上面
 函数的声明也会被提前---提前到当前所在的作用域的最上面

比如:

<script>
    console.log(num);//结果是undefined
    var num=2;
</script>

<script>
    f1();//输出"执行了"
    function f1() {
        console.log("执行了");
    }
</script>

<script>
       f1();//调用
       var num=20;//这个变量的声明会提升到变量使用之前
       function f1() {
         console.log(num);//结果是undefined
         var num=10;
       }
</script>

预解析中,变量的提升,只会在当前的作用域中提升,提前到当前的作用域的最上面

函数中的变量只会提前到函数的作用域中的最前面,不会出去

原文地址:https://www.cnblogs.com/hzdwwzz/p/10295696.html

时间: 2024-10-01 06:36:29

JavaScript有关作用域和预解析的相关文章

JavaScript中作用域和预解析

作用域以及预解析 在javascript中作用域是非常重要的,本文章将会说明作用域以及我们在工作,以及面试中的一些面试题,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家走入一些误区. 谈及作用域先就必须要说明预解析和词法作用域. 下面我们先说明一下: 预解析 代码在正常执行操作之前会对文档进行一次解析,这个操作就是将声明提升, 声明包括全局范围内 1.带有var的变量, 2.函数 文档预解析后会把文档中在全局函数中的内容储存起来,将全局中带有var的变量(var和变量

关于作用域和预解析的不常见重要知识

作用域和预解析 在javascript中作用域是非常重要的,本文章将会说明作用域,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家走入一些误区. 谈及作用域先就必须要说明预解析和词法作用域. 下面我们先说明一下: 预解析 代码在正常执行操作之前会对文档进行一次解析,这个操作就是将声明提升, 声明包括全局范围内  1.带有var的变量, 2.函数 文档预解析后会把文档中在全局函数中的内容储存起来,将全局中带有var的变量(var和变量名,注意:变量体不会随着提升,加载va

小白学js第六天之代码规范,作用域以及预解析

目录 代码规范 命名规范 变量规范 注释规范 空格规范 换行规范 作用域 全局变量 局部变量 块级作用域 作用域链 预解析 什么是预解析 变量提升 此篇木有脑图,嘻嘻 代码规范 命名规范 变量.函数的命名必须要有意义 变量一般用名词 函数一般用动词 变量规范 操作符前后要有空格 var name = 'zs'; 注释规范 // 这里是注释 空格规范 if (true) { } for(var i = 0; i < n; i++ ) { } 换行规范 var arr = [1, 2, 3, 4];

javascript里面的闭包,作用域,预解析

函数的作用域 1.全局变量=公用卫生间 2.局部变量=次卧卫生间      局部变量 全局无法使用      局部声明变量不加var的话就变成全局变量(不推荐使用) 3.闭包=次卧的可以用自己的卫生间,也可以用公用卫生间: 预解析 1.先把变量声明 全部提前,赋值不动 2.函数也有预解析,直接提前   3.预解析 不会脱离函数作用域,也不会冲出script标签 最多提到自己标签的顶部 代码执行顺序 见一个srcipt解析执行一个,执行完了 在执行下一个 案例1:      alert(a);  

作用域,预解析,对象,内置方法 Math Date Array

作用域 一段程序代码中所用到的名字并不总是有效可用的,而限定这个名字(变量)的可用性的代码范围,就是这个名字的作用域,作用域提高了逻辑程序的局部性,增强了可靠性,减少了名字冲突: JavaScript作用域(es6)之前:全局作用域,局部作用域 全局作用域:整个script标签或者是一个单独的JS文件 局部作用域(函数作用域):在函数内部就是作用域: 变量作用域 全局变量:在全局作用域下声明的变量:如果在函数内部没有声明(var)直接赋值的变量也是全局变量 num = 2; 局部变量:在函数内部

JS作用域概念-预解析规则

// 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var function 参数 a = ... 所有的变量,在正式运行代码之前,都提前赋了一个值:未定义 fn1 = function fn1(){ alert(2); } 所有的函数,在正式运行代码之前,都是整个函数块 JS 的预解析 遇到重名的:只留一个 变量和函数重名了,就只留下函数 2)逐行解读代码: 表达式

JS的作用域和预解析

当我们使用Js 来编写一个函数的时候,总是会分不清,自己所声明的变量到底是全局变量,还是局部变量,这就牵扯到了作用域的问题.以及在函数执行的时候,函数内部的变量与全局变量及输出结果,在不同状况下的关系问题.下面就让我来举例说明一下. 作用域: 指的是代码对不同的“范围”的划分. 划分规则: 1 全局是一个作用域 这个作用域叫做全局作用域 2 只有函数,可以划分这么一个“范围”(作用域) 这样划分出来的作用域叫做私有作用域. 划分规则的应用对象: 变量 所以我们可以理解为: 作用域 划分了一个所有

作用域和预解析

// 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var function 参数 a = ... 所有的变量,在正式运行代码之前,都提前赋了一个值:未定义 fn1 = function fn1(){ alert(2); } 所有的函数,在正式运行代码之前,都是整个函数块 JS 的预解析 遇到重名的:只留一个 变量和函数重名了,就只留下函数 2)逐行解读代码: 表达式

javascript预解析和作用域

JavaScript解析过程分为两个阶段: 一是:编译阶段.就是JavaScrip预解析阶段,在这个阶段JavaScript解析器将完成把JavaScript脚本代码转换到字节码; 二是:执行阶段.在编译阶段JavaScript解析器借助执行环境把字节码生成机械码,并顺序执行; 预解析:在当前的作用域中,js代码执行之前浏览器会默认把所有带var 和function的进行提前的声明或者定义; eg:var num=1; sum(); function sum(){console.log(num)