var a = 0,
b = 0;
function A(a) {
A = function (b) {
alert(a + b++);
};
alert(a++);
}
A(1);
A(2);
输出结果为1和4.
重点思路是:A(1)调用A函数后,AO活动对象创建,这时只会有值为1的a这一个属性,作用域链为[AO,Global],于是程序接着运行,将挂载到全局对象Global上的A变为了fun(b),此时fun(b)的作用域链是[AO,Global].接着程序运行到alert(a),输出结果为1,a变为2;
A(2)运行后,调用A即function(b),又创建了一个活动对象我们命名为BO,只有值为2的b这一个属性,此时function(b)的作用域链为[BO,AO,Global],由于在当前作用域下没有a,也就是BO没有a属性,于是向AO查找,此时AO形成闭包对象,只对外提供a属性,此时a的值为2,于是BO拿到a的值为2,又因为b的值为2,所以alert(a+b++)的结果为4
function an(abn) {
const a = 1;
abn();
}
const a = 2;
function abn() {
console.log("a", a);
}
an(abn);
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);
}
版权声明:本文为jhyxz原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。