下面代码输出是什么?
function fun(n, o){
console.log(o);
return {
fun : function(m){
return fun(m, n);
}
}
}
var a = fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1);
c.fun(2);
c.fun(3);
这是一道关于函数作用域的问题。
首先,我们因该知道,返回对象的fun属性调用的是最外层的fun函数,而不是它自己,否则就是递归造成的死循环
在一个函数执行时,如果遇到它自身没有的变量,那么它会去作用域中寻找,如果还是没有,那么就会报错,
了解了上面的知识,这道题我们最起码时因该有思路的,var a = fun(0), 这句的输出肯定是undefined,这没问题,
a.fun(1), 接下来调用fun(1, 0),这个0来自于它的作用域,这个函数它本身是没有的,所以输出0;
接下来,a.fun(2), => fun (2, n),这个n是多少呢?知道了这个这道题就没问题了,n因该还是0,为什么呢?
因为a没有得到更新,还是原先的那个在fun(0)时生成的a,它的fun函数的顺着作用域往下找,找到的n是0,
可能你会说:哎呀,不对啊,a.fun(1)执行的时候,不是调用了fun(1, 0),使得n变成1了吗?是的没错,是使得n变成了1,
但这是对于,fun(1,0)返回的那个对象来说的,对于由fun(0),生成的这个a,它的fun属性所能找的n始终为0,
因为每一次函数执行,都会生成一个新的object,返回的对象也是新的,这个新的对象里的属性fun,
对应的作用域也是新的,(范围没变,但所能找到的n的值变了)
明白了我上面所说的,你就能知道答案是什么了
undefined 0 0 0
undefined 0 1 2
undefined 0 1 1