var f = (function f() {
return "1";
}, function g() {
return 2;
})();
typeof f;//number
在IE里运行的结果,这里为什么是number而不是string呢?没理解.
首先,来解释下这段代码中的几个概念:
1. 立即执行的匿名函数
(function() { // do something here })();
定义一个匿名函数并立即执行它,任何在这个函数中申明的变量、函数在该函数外都不可访问。换句话说,通过这种方式,可以制造一个私有作用域。
2. 函数表达式、函数申明
函数申明的语法
function foo () { // do something here }
函数表达式的语法
var foo = function () { // do something here };
当语句以function开头时,解析器会认为这是一个函数申明,并且期待function之后跟随一个有效的函数名,否则会报syntax error。
这就是为什么我们在写立即执行的匿名函数时要在最外面包上一层()。()会将它包裹的东西转变成表达式,这样就不会报错了。
3. 逗号分隔表达式求值
var test = (1,2,3);
逗号分隔表达式的值取决于最后那一项,因此,上面的test == 3。
最后,来看看楼主的问题
(function f() { return "1"; }, function g() { return 2; })
根据概念3,逗号分隔表达式的值等于最后一项,上面语句等价于
(function g() { return 2; })
然后,立即执行这个函数g,并将它的返回值赋值给f,所以,f == 2。
3. 逗号分隔表达式求值
var test = (1,2,3);
逗号分隔表达式的值取决于最后那一项,因此,上面的test == 3。
这个解释太棒了,知其然,知其所以然~~~
(function f() { return "1"; }, function g() { return 2; })
这段代码是一个表达式,里面有两个值(方法),表达式取最后一个值,所以f()不起作用的,所以上面代码等同于:
var f =(function g() { return 2; })();
所以会是number
为什么不返回第一个表达式的值啊?两个方法都有返回值啊?
@雪拥蓝关: f和g都是匿名表达示,这里定义了两个,所以第一个被覆盖了,没起作用
我的理解是:1>
(function f() { return "1"; }, function g() { return 2; })
到这里是对匿名函数的定义,并且定义了两次,类似于
function test() { return "1"; } function test() { return 2; }
2>因为是对同一函数进行多次定义,所以调用的最后定义的函数,又因为匿名函数加上了()是执行的意思,所以是执行了第二个方法,所以是number