js函数作用域例题

下面代码输出是什么?

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 

猜你喜欢

转载自blog.csdn.net/dreamjay1997/article/details/83272221