J34 堆内存和栈内存的练习题

134 阅读2分钟

1. 计算题(函数每一次执行都是形成全新的上下文,和之前形成的上下文没有必然关系 )

var i = 20;
function fn() {
    i -= 2;
    var i = 10;
    return function (n) {
        console.log((++i) - n);
    }
}
var f = fn();
f(1);//10
f(2);//10
fn()(3);//8
fn()(4);//7
f(5);//9
console.log(i);//20

2 计算题

var n = 0;
function a() {
	var n = 10;
	function b() {
		n++;
		console.log(n);//=>11
	}
	b();
	return b;
}
var c = a();
c();//=>12
console.log(n); //=>0

3 计算题

 let x = 5;
function fn(x) {//x:6
	// 私有上下文中有私有变量x
    return function(y) {//7 8 10
		// 这里的x都是EC(FN)中的x
        console.log(y + (++x));
    }
}
let f = fn(6);
f(7);//14
fn(8)(9);//8 18
f(10);//18
console.log(x); //5

4 计算题

 let x = 5;
function fn() {   
	// 私有上下文中没有x
    return function(y) {
		// 这里的是x是EC(G)中的x
        console.log(y + (++x));
    }
}
let f = fn(6);
f(7);//13
fn(8)(9);//16
f(10);//18
console.log(x);//8

5 计算题

 let a = 0,
     b = 0;

function A(a) {
	A = function (b) {
		alert(a + b++);
	}//=>第一执行A的时候,把全局A函数重新赋值为里面的新的小函数,后期在执行A,
执行的是赋值后的小函数 (此处小函数是私有上下文中的,但是此时也相当于被外面的A占用了,
所以上下文不会销毁掉的)
	alert(a++);
}
A(1);//"1"
A(2); //"4"

6 计算题

var test = (function (i) {
return function () {
alert(i *= 2); //="4"
}; 
})(2);
test(5);

/* 
* EC(G)全局向下文
*    var test;
*/
// test = 自执行函数执行的返回结果赋值给test
//      = BBBFFF000; (返回的小函数)
var test = (function (i) {
/*
 * 自执行函数执行 EC(AN)  =>不会释放
 *    i = 2 (4)
 * 作用域链:<EC(AN),EC(G)>
 * 形参赋值
 * 变量提升
 */
return function () {
/*
* 私有上下文 EC(TEST)
* 
* 作用域链:<EC(TEST),EC(AN)>
* 初始化ARGUMENTS = { 0:5,length:1 }
* 形参赋值
* 变量提升
*/
alert(i *= 2); //=>i=i*2   i是上级上下文EC(AN)中的i
}; //=>return BBBFFF000;
})(2);
test(5);