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.log
b1.b2[2]
获取数组的第三个元素,即console.log
console.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
返回的函数