为什么这个片段会抛出意外的令牌?

时间:2016-09-17 18:41:05

标签: javascript

以下代码段会在行处抛出意外的令牌:b:function(func,data1) https://jsbin.com/qobicahica/edit?html,js,output

var Funcb = (function()
{
return 
{
    b: function (func, data1)
    {
        alert(1);
    }
};
    })();

Funcb.b(1,1);

但是,下面教程中的类似示例有效:

https://toddmotto.com/everything-you-wanted-to-know-about-javascript-scope/

    // define module
    var Module = (function () {
  return {
    myMethod: function () {
      console.log('myMethod has been called.');
    }
  };
})();

// call module + methods
Module.myMethod();

编辑: 返回后删除换行符后工作,但为什么? 当javascript是如此宽容和松散类型时,那么为什么不会忽略?:

var Funcb = (function()
    {
    return{
        b: function (func, data1)
        {
            alert(1);
        }
    };
        })();

2 个答案:

答案 0 :(得分:2)

问题出在第三行,在return语句后插入分号。请参阅rules for JS automatic semicolon insertion

删除return之后的换行符,它应该有效。

var Funcb = (function() {
    return {
        b: function (func, data1) {
            alert(1);
        }
    };
})();

Funcb.b(1,1); 

要回答编辑,请参阅specs的第28页。

  

来源

return
a+b
     

通过自动分号插入转换为以下内容:

return;
a+b;
     

表达式a + b不被视为要返回的值   return语句,因为LineTerminator将它与   令牌回报。

答案 1 :(得分:1)

您的退货声明应包含一些内容。大括号位于下一行,应该在return语句旁边。这会产生意外的令牌错误。

var Funcb = (function() {
    return {
        b: function (func, data1) {
           alert(1);
        }
    };
})();
Funcb.b(1,1);