自由变量:以前我们讲过局部变量和全局变量,那什么又是自由变量呢?简单来说,它介于上述两者之间。举个例子说明下。
<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>
菜鸟爬行中…