//题目
function Try(a,b)
{
console.log(b);
return{
Try:function(c)
{
return Try(c,a);
}
}
}
var d = Try(0);
d.Try(1);
d.Try(2);
d.Try(3);
var e = Try(0).Try(1).Try(2).Try(3)
var f = Try(0).Try(1)
f.Try(2);
f.Try(3);
d 代码的执行
undefined
0
0
0
e 代码的执行
undefined
0
1
2
f 代码的执行
undefined
0
1
1
题目部分:Try(a,b)函数中先输出o,再返回一个对象。对象有一个属性Try,它保存着一个函数对象的地址,简单说它是一个函数。这个函数返回之前定义的Try函数同时传
递了两个实参,一个是c(调用对象的Try函数时传递),一个是a。根据作用域链a是外部函数的变量。
第一道题:首先调用了Try(a,b)函数,并且只传递一个参数给了a。b没有传递参数但没有报错,因为函数上下文对象对a,b声名且赋值undefined,返回对象地址给d。执行d.Try(1),这里调用了对象自身属性的函数Try,下一步执行 return Try(c,a)。当第一次调用Try函数的时候由于被嵌套的函数使用了外部函数的数据因此产生了闭包,变量a仍旧存在。此时return Try(c,a)传过去的a的值是第一次调用Try(0)时a的值,a的值是0,也就是return Try(1,0)。执行函数的时候产生了新的闭包,打印了 0, 然后再返回一个对象地址,然而这个地址并没有被接收,它成为了垃圾对象被回收。执行d.Try(2),此时d的值,也就是对象的地址没有发生改变,其数据原封不动故而a的值还是第一次调用Try(0)时产生闭包时的值,d.Try(2),d.Try(3)同理
第二题:这里与第一题不同的是每次调用Try(a,b)函数返回的对象地址都被接收,每个新对象中a的值都不同。
第三题: f接收了当a的值为1的时候对象的地址,故而之后的f.Try(2),f.Try(3),都是对同一个函数对象的调用
希望大佬给我指指点点~~