var b1 = {b2: [1, "abc", console.log],b3: function () {console.log("b3");return function () {return "inner";};},};
// 执行调用
b1.b2[2](4); // 4b1.b3()(); // b3
console.log(b1.b3()()); // b3 inner


1. 对象属性访问
b1.b2 和 b1.b3 是通过点符号访问对象属性的方式。b1 是一个对象,它有两个属性:
b2: 一个数组b3: 一个函数b3: function () {console.log("b3"); // 第一步:立即执行,输出"b3"return function () { // 第二步:返回一个匿名函数return "inner";}; }
2. 数组元素作为函数调用
b1.b2[2](4) 这行代码展示了几个重要概念:
b1.b2是一个数组,包含三个元素:1,"abc", 和console.logb1.b2[2]获取数组的第三个元素,即console.logconsole.log是一个函数,所以可以像普通函数一样被调用(4)是传递给console.log的参数
当执行 b1.b2[2](4) 时,实际上等同于 console.log(4),所以会在控制台输出 4。
b3: function () {console.log("b3"); // 第一步:立即执行,输出"b3"return function () { // 第二步:返回一个匿名函数return "inner";};
}
执行过程:
- 调用
b1.b3()时,首先执行外层函数体:- 输出
"b3"到控制台 - 返回内层的匿名函数
- 输出
- 然后
( )表示立即调用这个返回的匿名函数 - 匿名函数执行并返回字符串
"inner"
但根据你的注释 b1.b3()(); // b3,似乎有误解。实际上:
b1.b3()会输出"b3"并返回一个函数b1.b3()()会输出"b3"然后返回"inner"- 如果你只看到
"b3",可能是因为你没有捕获第二个调用的返回值
3. 链式函数调用
b1.b3()() 展示了链式函数调用的概念:
- 第一个
()调用b3函数 - 第二个
()调用b3返回的函数
