js 作用域

作用域

标识符生效的范围,比如一个变量,这某个范围生效,出来了这个范围就访问不到了。

全局作用域

个script标签或一个js文件中会形成一个区域叫全局作用域,在srcipt标签内的全局作用域中定义的变量是全局变量,在全局作用域内可以访问。

<script>
//全局作用域中的变量
var a = 20;
function a(){
	/*
	函数也在全局作用域里面
	因此函数也可以访问在全局作用域中的变量
	*/
	console.log(a);
}
</script>

局部作用域

在函数内部也会形成作用域也叫局部作用域,在函数里定义的变量是局部变量,只在函数内部起作用,对外不可见。

function a(){
	var p = 20;
}
//报错。p是局部变量只能在函数内起效
console.log(p);

访问标识符符合一个原则,里面的可以访问外面的,不管嵌套多少层都可以访问,外面的就是不能访问里面,换句话说局部作用域是在外部作用域范围内的,站在内部函数的角度考虑,它处在外部环境的内部,所以在函数是可以访问到外部的,而反过来不行。

例子:
以下代码中fn3不光在fn2的环境中也在fn1和全局的环境中,因此可以访问到全局、fn1、fn2、fn3中的变量,而反过来不行。

function fn1(){
	var a = 30;
	function fn2(){
		var b = 20;
		function fn3(){
			var c = 10;
			//60 a、b、c都可以访问到
			console.log(a + b + c);
		}
		fn3()
		//报错
		console.log(c)
	}
	fn2();
}
fn2()

作用域链
如果在不同的作用域中有同名的变量该怎么访问?

var a = 0
function fn1(){
	var a = 1;
	function fn2(){
		var a = 2;
		//2
		console.log(a);
	}
	fn2();
}
fn1();

结果: 2
标识符查找的规则: 就近原则,当在函数作用域中操作一个变量时,会先从自己的作用域中查找有没有这个标识符,如果有,就使用这个标识符的值,如果没有就去上一层的作用域找这个标识符,直到找到全局作用域为止,如果全局作用域依然没有这个标识符,则抛出错误: test is not defined,这种链式查找关系我们称为作用域链。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值