js作用域详解

什么是作用域

作用:生效,可以使用
域:范围
一个变量(变量名,函数名)可以生效的范围

作用域分类

  1. 全局作用域
    一个html页面就是一个全局作用域
    打开页面的时候,作用域就生成了,知道关闭页面为止

  2. 局部作用域
    只有函数生成私有作用域
    每一个函数就是一个私有作用域

作用域的上下级关系

全局作用域最大,所有的私有作用域都是在全局作用域下面的
函数生成的私有作用域,函数写在哪个作用域里面,就是哪个作用域的子级

<body>
	<script>
	//这个位置就是全局作用域
	
	function fn() {
		//这个位置就是 全局作用域下 fn函数的子级作用域

		function fun() {
			//这个位置就是 全局作用域下  fn函数私有作用域下的 fun函数的私有作用域
		}
	}
	</script>
<body>

变量 定义/使用/赋值 概念

  1. 定义
    有var关键字
    或者function 函数名(){}
var a = 10;
function fn(){}
  1. 使用
    就是当你需要拿到一个变量的值去使用的时候
var a = 10;
console.log(a);  //我要使用a的值去打印出来
a+1				//我要使用a的值去和1进行运算
var b = a;		//我要使用a的值赋值给b
  1. 赋值
    给一个变量进行赋值的操作
var a = 10;		//要把10赋值给a这个变量
var b = function(){}	//要这个函数赋值给b这个变量

作用域的三大规则

  1. 变量定义规则
    当你在定义一个变量的时候
    你把这个变量定义在哪个作用域里面
    就只有这个作用域及其后代作用域可以使用
    当前作用域的所有祖先级作用域不能使用
var a = 100//全局作用域里面的变量 a

function fn() {
	var b = 200 // fn 私有作用域里面的变量 b
	
	function fun() {
		var c = 300 // fun 私有作用域里面的变量 c
	}
}
  1. 变量使用规则
    当你需要使用一个变量的时候
    首先, 在自己作用域内部查找, 如果有, 就直接使用, 停止查找
    如果没有, 就去上一级作用域查找, 有就使用, 停止查找
    如果还没有, 就再去上一级作用域查找, 有就使用, 停止查找
    直到全局作用域都没有, 那么就报错 “变量 is not defined”
var a = 10;

function fn(){
	var a = 20;
	
	function fun() {
		var a = 30;
		var b = 200;
		console.log(a) //结果为30
	}
	
	console.log(a);//结果为20
	console.log(b);//报错 "b is not defined",因为b是fun函数局部变量
}
console.log(a);//结果为10
  1. 变量赋值规则
    当你需要给一个变量赋值的时候
    先在自己作用域内部查找, 如果有, 就给自己作用域内部的变量赋值
    如果没有, 就向上一级查找, 如果有就给父级的变量赋值
    如果还没有, 就继续向上查找
    直到全局作用域都没有, 那么就把这个变量定义为全局变量, 再进行赋值
var a = 10; // 全局变量a
var b = 20; //全局变量b

function fn() {

	var a = 100 ;//声明fn私有变量a

	b = 200;//没有var关键字声明,等于给全局变量b重新赋值

	console.log(a);//输出100
	console.log(b);//输出200
}

fn(); // 因为fn函数的执行, 给全局变量b重新进行了赋值操作

console.log(a);//输出10
console.log(b);//输出200

作用域小案例

案例1

var a = b = 10;
console.log(a);		//10
console.log(b);		//10

代码解析
var a = b = 10
实际上是三个部分

  1. var a
  2. a = b
  3. b = 10
    等于号(赋值) 的规则是从右往左

1.预解析
      var a
2.代码执行的时候
      b = 10 //标准的变量赋值操作, 根据变量赋值规则, 会把 b 定义成全局变量再赋值

案例2

var a = b;//这一步会报错
    b = 20;
    a = 10;
    console.log(a);
    console.log(b);
  1. 预解析
    var a
    在浏览器里面声明了一个 a 变量可以使用

  2. 代码执行
    b = 20 // 对于变量 b 来说是变量的赋值
    a = b // 对于变量 b 来说, 是变量的使用, 报错了, 后面就没有代码了

案例3

function fn() {
	a = 100; // 这个fn里面没有用var定义a变量, a变成全局变量并赋值
	console.log(a);		//100
}

fn();
console.log(a);		//100
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值