作用域解析

了解作用域

	简单来说 作用域就是 **变量** 可以生效的范围
		+ 变量可以是 函数名 或者 变量名

作用域的分类

	1: 全局作用域
		+ 一个 html 页面就是一个*全局作用域*
		+ 全局作用域 打开页面就自动生成,直到关闭页面为止
	
	2:局部作用域 或者叫(私有作用域)
		+ **只有函数生成私有作用域**
		+ 每一个函数 就是一个私有作用域

作用域的上下级关系

在这里插入图片描述

  1. 全局作用域最大, 所有的 私有作用域 都是在全局作用域下面的
    函数生成的私有作用域, 在函数私有作用域下写的函数也是这个
    私有作用域的子级作用域

     function L1() {
         // 这个位置就是 全局作用域的一个叫做 L1 的子级作用域
       function L2() {
         // 这个位置就是 全局下的 L1 私有作用域下的 L2 私有作用域
       }
         //L2是L1的子级作用域
     }
    

作用域的三大规则

	一.变量定义规则
		定义
          有 var 关键字
          或者 function 函数名() {}
          var num           // 定义变量
          function fn() {}  // 定义变量
          
  ***********************************
    explanatory start 变量定义规则
  ***********************************
  
    **当你在定义一个变量的时候
    你把这个变量定义在哪个作用域里面
    就只有 这个作用域 及其 后代作用域 可以使用
    当前作用域的所有祖先级作用域不能使用**
    
  ***********************************
    explanatory end 变量定义规则
  ***********************************
 全局作用域里面的变量 a
     var a = 100
       //全局变量不能调用 变量 b 与 变量 c
     function fn() {
       var b = 200  // fn 私有作用域里面的变量 b
       // fn 私有作用域不能调用 变量 c
	   function fun() {
	     	  var c = 300  // fun 私有作用域里面的变量 c
	     	  // fun 私有作用域可以调用 变量 a 与 变量 b 与 变量 c
       }
     }
			二.变量使用规则
				使用
		          就是当你需要拿到一个变量的值去使用的时候
		          console.log(num) // 我要使用 num 的值去打印出来
		          1 + num          // 我要使用 num 的值去和 1 进行运算
		          var abc = num    // 我要使用 num 的值赋值给 abc
		          
		           ***********************************
			        explanatory start 变量的使用规则
			      ***********************************
			      
			        **当你需要使用一个变量的时候
			        首先, 在自己作用域内部查找, 如果有, 就直接使用, 停止查找
			        如果没有, 就去上一级作用域查找, 有就使用, 停止查找
			        如果还没有, 就再去上一级作用域查找, 有就使用, 停止查找
			        直到全局作用域都没有, 那么就报错 "变量 is not defined"**
			
			      ***********************************
			        explanatory end 变量的使用规则
			      ***********************************
     var a = 100 //全局作用域变量 a
	 //console.log(c) // 这个行代码打开就会报错  'c is not defined'	
     function fn() {

  	    var b = 200
		console.log(a) // 得到的是全局作用域 变量 a 的值 100
       function fun() {

         var a 
         var c = 300

         console.log(b) // 得到的是 fn 作用域里面的 b 变量的值 200
         console.log(a) // 得到的是 fun 作用域里面 a 的值 undefined

       }
       fun()
     }
    fn()
	3.变量赋值规则
		赋值
          给一个变量进行赋值的操作
          num = 100             // 要把 100 这个值赋给 num 这个变量
          num = function () {}  // 要把 函数 这个值赋给 num 这个变量

  ***********************************
    explanatory start 变量赋值规则
  ***********************************

    当你需要给一个变量赋值的时候
    先在自己作用域内部查找, 如果有, 就给自己作用域内部的变量赋值
    如果没有, 就向上一级查找, 如果有就给父级的变量赋值
    如果还没有, 就继续向上查找
    直到全局作用域都没有, **那么就把这个变量定义为全局变量, 再进行赋值**

  ***********************************
    explanatory end 变量赋值规则
  ***********************************
    var a = 100 // 全局 a 变量

    function fn() {

       var a = 200 // fn 私有变量 a
	   c = 300
       console.log(a)

    }

    fn() 
	console.log(c) // 打印值为 300
    console.log(a) // 打印值 为 200 ,100
    /* 这里 a 打印值为什么会有 100 是因为 当 fn 函数执行完之后
       父级作用域不能调用子级的变量 所以会找自己作用域的 var a = 100
       
       这里 c 为什么可以调用子级的变量,是因为当你直接给一个变量赋值而
       不先定义它为变量时 会先在自己作用域找定义变量,如果没有就往上级找
       直到找到为止,如果整个全局作用域都没有定义过这个变量,那么就把这个
       变量定义为全局变量,再进行赋值。 所以此时 c 为全局变量 300
        */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值