zoukankan      html  css  js  c++  java
  • 1.2 作用域链

    1.如何区分私有变量和全局变量

     a. 在全局作用域下声明(预解释的时候)的变量是全局变量

     b.在”私有作用域中声明的变量”和“函数的形参”都是私有的变量

      在私有作用域中,我们代码执行的时候遇到了一个变量,

      首先,需要确定它是否为私有变量,如果是私有变量,那么和外面的任何东西都没关系;

      如果不是私有的,则往当前作用域的上级作用域进行查找,如果上级中也没有,则继续查找,一直找到window为止(此机制称为,作用域链)

    2.当函数执行的时候(直接目的:让函数体中的代码直接执行),首先会形成一个新的私有的作用域,然后按照如下步骤执行:

     a. 如果有形参,先给形参赋值

     b. 进行私有作用域中的预解释

     c. 私有作用域中的代码从上到下的执行

      函数形成一个新的私有的作用域保护了里面的私有变量不受外界的干扰(外面修改不了私有的,私有的也修改不了外面的) --> 此机制称为闭包

    console.log(total); //undefined
    var total = 0;
    function fn (num1.num2) {
      console.log(total); // undefined
      var total = num1 + num2;
      console.log(total); // 300     
    }
    fn(100,200)
    console.log(total) // 0

     

    console.log(total); //undefined
    var total = 0;
    function fn (num1.num2) {
      console.log(total); // total不是私有的,找全局下的total,也就是在这里出现的所有的total其实应该是全局的 ->0
      total = num1 + num2; // 全局total=300
      console.log(total); // 300     
    }
    fn(100,200)
    console.log(total) // 300

     注意:在全局作用域中,带var和不带var的关系

      区别:带var的可以进行预解释,所以在赋值的前面执行不会报错,不带var 的不能进行预解释的,在前面执行会报错

      关系:num=12 -> 相当于给window增加了一个叫做num2的属性名,属性值是12

         var num = 12 首先它相当于给全局作用域增加了一个全局变量num,但是不仅如此,它也相当于给window增加了一个属性名num,属性值是12

    console.log(num); -> undefined
    var num = 12;
    console.log(num2); ->Uncaught ReferenceError: num2 is not defined  
    num2 = 12;
    console.log(num2); ->12 window.num2

      在私有作用域中出现一个变量不是私有的,则往上级作用域进行查找,上级没有则继续向上查找,一直找到window为止,如果window下也没有:

        1.我们是获取值:console.log(total); //报错了,js中如果在不进行任何处理的情况下,上面的代码报错,下面的代码都不在执行了

        2.我们是设置值:total = 100 //相当于给window增加了一个属性名total,属性值是100

    function fn () {
     console.log(total) //->Uncaught ReferenceError: num2 is not defined  
     total = 100
    }
    fn()
    console.log(total) // 100
  • 相关阅读:
    为什么需要Docker?
    一分钟学会《模板方法模式》
    2018再见|2019你好
    三分钟学会《门面模式》
    策略模式原来这么简单!
    外行人都能看得懂的机器学习,错过了血亏!
    我是如何将博客转成PDF的
    面试前必须知道的MySQL命令【explain】
    count(*)、count(1)和count(列名)的区别
    Linux shell去除字符串中所有空格
  • 原文地址:https://www.cnblogs.com/z-dl/p/8629365.html
Copyright © 2011-2022 走看看