缺少分号意外地破坏了脚本

时间:2011-09-02 18:05:10

标签: javascript function closures undefined

注意:最初,我认为问题是由更复杂的事情引起的;我现在看到(并编辑了标题和示例代码)唯一的区别是分号的存在与否。这可能使得这个问题很容易回答,但我仍然感到惊讶的是,在这种情况下,后面的分号很重要而不是其他分号......

为什么这样做:

<script type="text/javascript">
    this.someFunc = function () {};
    (function () {
        console.log("self-invoking function called.")
    })();
</script>

但这不是:

<script type="text/javascript">
    this.someFunc = function () {}

    (function () {
        console.log("self-invoking function called.")
    })();
</script>

然而,这样做:

<script type="text/javascript">
    this.someFunc = function () {}
    var someVar = "value";
    console.log("someVar is:"+someVar);
</script>

后者将自调用函数解释为undefined,因此无法评估/执行它。在OSX上的Chrome 13,Firefox 6和Safari 5上进行了测试。

2 个答案:

答案 0 :(得分:2)

我相信第二个片段实际上是在执行空函数声明。如果您将示例更改为:

<script type="text/javascript">
    this.someFunc = function (arg) { console.log(arg); }

    (function () {
        console.log("self-invoking function called.")
    })();
</script>

然后运行(FF6),您将看到它记录:function()。它传递第二个匿名函数作为第一个参数。如果重新排列,这会更有意义:

<script type="text/javascript">
    this.someFunc = function (arg) { console.log(arg); }(
        function () {
        console.log("self-invoking function called.")
    })

    (); //the parser doesn't know what to do with this line.
</script>

答案 1 :(得分:0)

只需查看问题右侧的第一个相关主题:Why should I use a semicolon after every function in javascript?

接受的答案是对这种行为的一个很好的解释。