javascript中的原型,原型链以及闭包(9)---------自由变量和作用域链

自由变量:以前我们讲过局部变量和全局变量,那什么又是自由变量呢?简单来说,它介于上述两者之间。举个例子说明下。

<script>
	function fn() {
		var max = 20;
		console.log(max);
		return function ret () {
			console.log(max);
		}
	}
	var Fn = fn();
	Fn;//20
	console.log(".........");
	Fn();//20,20

这里可能有朋友会产生个误解,以为Fn只是个函数表达式或者只是返回函数ret【可以为匿名函数,我这里为了说明,取个名字】。注意下,如果是Fn,它只是函数fn的表达式;如果是Fn(),则即是fn的函数表达式(因为函数fn执行环境被激活了),也是返回函数ret

好了,就题论题。就论返回函数ret中的max,没有定义却打印出来,这是因为js引擎会先看看自身函数ret中有没有max,若没有则向上级fn函数报告没有,此时fn就会看看自己有没有max,有则反馈给ret函数,没有接着上报,直到全局。然而此时这个上报过程及称为作用域链max及称为自由变量

关于自由变量,值得注意一点的是
在函数体调用自由变量【自身却没有时】时,如果此变量是作为函数从外部传进的参数,js引擎则从调用它的函数内开始寻找,直至全局;若不是,则在调用自由函数变量函数创建时,便确定了自由变量所在作用域。

<script>
	
	var max = 100;
	
	//只是声明函数,max并没有传值,因为还未被调用
	function fn2(max) {
		console.log(max)
	}

	function fn1() {
		var max = 20;
		//fn2函数被调用,max作为参数,向外部请求值,选择方式为就近原则
		fn2(max);
	}
	fn1();//20
	
	function fn(fn1) {
		var max = 10;
		//因为函数fn1没有任何参数向外部请求数据
		//内部自由变量max,以自身函数体为起点,遵循作用域链寻找变量max
		//又因为函数体fn1与函数体fn为同等级函数体,所以fn1函数体中的max 不为 10
		fn1();
	}
	//函数fn1作为参数,就近原则,选择函数fn1
	fn(fn1);20
	
</script>

菜鸟爬行中…

猜你喜欢

转载自blog.csdn.net/h1234561234561/article/details/87925733