首先看这个 这两个运行结果是不一样的 前两个是3 后面是10
var length = 10; var arr = [function(){console.log(this.length);},2,3]; arr[0](); (arr[0])(); (function(){console.log(this.length);})(); var tmpFun = arr[0]; tmpFun();
关于这一句 arr[0]() != (function(){console.log(this.length);})() 他们并不等同
这个arr[0]不再是取出元素 以为这个元素是一个可执行的函数 arr[0]() 相当于 obj.xxx() 此时的this 是 arr
PS 那么为什么 arr[0]() 和 (arr[0])[0] 是一样的呢? 可以看这个 http://www.cnblogs.com/cart55free99/p/4189226.html
若 a.b是一个函数 遇到(a.b)() 编译器会去掉那层括号 也就是用 a.b()来执行
var length = 10; function fn() { console.log(this.length); } var obj = { length: 5, method: function(fn) { fn(); arguments[0](); } }; obj.method(fn, 1);
所以这个题目输出 10 , 2 2是arguments的长度