我有这两个代码块。
socket.on('chatMessage', function(message) {
message.type = 'message';
message.created = Date.now();
message.username : socket.request.user.username;
});
socket.on('disconnect', function() {
io.emit('chatMessage', {
type: 'status',
text: socket.request.user.username + ' left the conversation.',
created: Date.now(),
username: socket.request.user.username,
});
});
如果我将:
或=
更改为其他,则Webstorm会给我错误。Expression statement is not assignment or call.
有人可以解释为什么会这样吗?提前谢谢。
答案 0 :(得分:3)
您的第一个代码块是定义功能块。您的第二个代码块是定义对象定义。每种语法都允许使用不同的语法,您必须使用适当的语法来匹配上下文。
您的第一个代码块只是在功能块中执行一系列语句。这一行末尾的{
:
socket.on('chatMessage', function(message) {
定义功能块的开头。因此,Javascript正在寻找在该上下文中合法的语句。每行代码都需要一个合法的Javascript语句。和,
message.username : socket.request.user.username;
在这种情况下,不是法律声明。如果您尝试将值分配给message.username
,则其有效语法为:
message.username = socket.request.user.username;
在第二个块中,您处于对象定义的中间。这一行末尾的{
:
io.emit('chatMessage', {
启动对象定义。因此,在该对象上定义属性的合法语法如下所示:
username: socket.request.user.username,
所以,这里有两个关键:
识别{
何时表示功能块的开始与对象定义的开始。您的第一个代码块启动一个函数体,第二个代码块启动一个对象定义。
了解功能块中允许的语法与对象定义中允许的语法之间的区别。
答案 1 :(得分:0)
没关系:
message.type = 'message';
没关系:
message.created = Date.now();
这不是:
message.username : socket.request.user.username;
应该是:
message.username = socket.request.user.username;
您的问题不明确 - 当您将:
更改为=
或更改之前,是否收到警告?您没有说出哪一行会导致错误,我认为它是:
而不是=
的那一行。
你确定你没有使用可以不同方式解释冒号的TypeScript吗?