首页 新闻 会员 周边

js 问题请高手解惑,谢谢~

0
悬赏园豆:10 [已解决问题] 解决于 2012-07-04 17:40

var f = (function f() {
return "1";
}, function g() {
return 2;
})();
typeof f;//number

在IE里运行的结果,这里为什么是number而不是string呢?没理解.

js
Sky Wang的主页 Sky Wang | 初学一级 | 园豆:193
提问于:2012-07-02 17:22
< >
分享
最佳答案
2

来拆解下,其实@artwl说的是对的。

首先,来解释下这段代码中的几个概念:

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。

 

 

收获园豆:6
BetaRabbit | 菜鸟二级 |园豆:267 | 2012-07-03 16:56

3. 逗号分隔表达式求值

var test = (1,2,3);

逗号分隔表达式的值取决于最后那一项,因此,上面的test == 3。

 

这个解释太棒了,知其然,知其所以然~~~

Sky Wang | 园豆:193 (初学一级) | 2012-07-04 17:41
其他回答(2)
0
(function f() {
return "1";
}, function g() {
return 2;
})

这段代码是一个表达式,里面有两个值(方法),表达式取最后一个值,所以f()不起作用的,所以上面代码等同于:

var f =(function g() {
            return 2;
})();

所以会是number

收获园豆:2
artwl | 园豆:16736 (专家六级) | 2012-07-02 18:02

为什么不返回第一个表达式的值啊?两个方法都有返回值啊?

支持(0) 反对(0) 轻狂の书生 | 园豆:1042 (小虾三级) | 2012-07-02 22:09

@雪拥蓝关: f和g都是匿名表达示,这里定义了两个,所以第一个被覆盖了,没起作用

支持(0) 反对(0) artwl | 园豆:16736 (专家六级) | 2012-07-03 09:07
0

我的理解是:1>

(function f() {
return "1";
}, function g() {
return 2;
})

到这里是对匿名函数的定义,并且定义了两次,类似于

        function test() {
            return "1";
        }

        function test() {
            return 2;
        }

2>因为是对同一函数进行多次定义,所以调用的最后定义的函数,又因为匿名函数加上了()是执行的意思,所以是执行了第二个方法,所以是number

 

 

 

 

收获园豆:2
Mike.Jiang | 园豆:127 (初学一级) | 2012-07-02 23:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册