有人可以解释这个错误:表达式语句不是赋值或调用

Raj*_*rik 3 node.js socket.io

我有这两块代码。

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,
    });
});
Run Code Online (Sandbox Code Playgroud)

如果我更改:或更改=为其他,Webstorm 会给我错误。Expression statement is not assignment or call.有人可以解释为什么会发生这种情况吗?提前致谢。

jfr*_*d00 6

您的第一个代码块是定义一个功能块。您的第二个代码块是定义对象定义。每个都允许使用不同的语法,您必须使用适当的语法来匹配上下文。

您的第一个代码块只是在功能块中执行一系列语句。在{这行的末尾:

socket.on('chatMessage', function(message) {
Run Code Online (Sandbox Code Playgroud)

定义功能块的开始。因此,Javascript 正在寻找在该上下文中合法的语句。每行代码都需要有一个合法的 Javascript 语句。和,

message.username : socket.request.user.username;
Run Code Online (Sandbox Code Playgroud)

在这种情况下不是法律声明。如果您尝试为 赋值message.username,则其有效语法为:

message.username = socket.request.user.username;
Run Code Online (Sandbox Code Playgroud)

在您的第二个块中,您处于对象定义的中间。在{这行的末尾:

io.emit('chatMessage', {
Run Code Online (Sandbox Code Playgroud)

开始一个对象定义。因此,在该对象上定义属性的合法语法如下所示:

username: socket.request.user.username,
Run Code Online (Sandbox Code Playgroud)

所以,这里有两个键:

  1. 识别何时{表示功能块的开始与对象定义的开始。您的第一个代码块启动一个函数体,第二个启动一个对象定义。

  2. 了解功能块中允许的语法与对象定义中允许的语法之间的区别。