其他分享
首页 > 其他分享> > 【js重学系列】作用域

【js重学系列】作用域

作者:互联网

作用域

谈起闭包首先要理解作用域,什么是作用域?
在 JavaScript 中, 作用域为可访问变量,对象,函数的集合。

局部作用域

全局作用域

变量生命周期

			var b = 1;
			function a() {
				var c=1;
				console.log('b:',++b);
				console.log('c:',++c);
			}
			a() //b: 2 c: 2
			a() //b: 3 c: 2
			a() //b: 4 c: 2
可以看出变量的生命周期,局部变量在函数执行时创建,执行完毕后销毁,所以每次调用都是开辟新的内存地址,都是新的值,全局变量在页面关闭后销毁,所以每次调用都会累加值

作用域链

在ES5中只存在两种作用域, 1️⃣全局作用域 2️⃣局部作用域
当访问一个变量时,解释器会首先在当前作用域查找标示符,如果没有找到,就去父作用域找,直到找到该变量的标示符或者不在父作用域中,这就是作用域链。 值得注意的是,每一个子函数都会拷贝上级的作用域,形成一个作用域的链条。

			var x = 1;
			var y = 1;

			function demo() {
				var x = 2

				function demo2() {
					var x = 3;
					console.log(x); //3
					console.log(y); //1
				}
				demo2()
			}
			demo()

块级作用域

			for (var i = 0; i < 3; i++) {
				setTimeout(function() {
					console.log(i);  //333
				},2000)
			}
			for (let i = 0; i < 3; i++) {
				setTimeout(function() {
					console.log(i);  //012
				},2000)
			}
			块级作用域的理解:
			var定义的没有块级作用域,循环三次结束后,才会执行定时器里的回调函数,然后找到父级作用域,由于父级作用的i没有块级作用域,所以访问父级的i的时候,i的值已经变成了3
			let定义的又块级作用域,去找父级的i的时候i的值时每次循环传入的值,不会被后面的更改,所以能输出012

标签:重学,console,函数,作用域,局部变量,js,var,变量
来源: https://www.cnblogs.com/ycyc123/p/15730082.html