2016-09-17 96 views
1

以下代码段抛出在线路意外的标记:B:功能(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); 
     } 
    }; 
     })(); 
+0

https://jsfiddle.net/L01k684r/ – guest271314

回答

2

问题出在第三行,在返回语句之后插入了分号。请参阅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为不被视为由 返回被返回的值声明,因为一个LineTerminator将它从 令牌返回中分离出来。

1

你return语句应该包含这样的。大括号位于下一行,应位于return语句旁边。这是给出意想不到的令牌错误。

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

感谢您的检查。发布后发现,编辑该问题。当javascript如此宽容且松散地输入时,为什么这不被忽略? – Stacky

+1

因为在你的例子中函数返回null(一个空的return语句),然后解析器试图评估未分配的{b:func ..}对象。 –

相关问题