当前位置: 首页 > 面试题库 >

通过socket.io发送匿名函数?

商昆琦
2023-03-14
问题内容

我想创建一个客户端函数,该函数可以使用客户端变量来接收和执行任意命令。我将使用socket.io从服务器发送这些函数,以发送包含匿名函数的JSON对象,这将是我的命令。它看起来像以下内容:

//client side

socket.on('executecommand', function(data){
    var a = "foo";
    data.execute(a); //should produce "foo"
});

//server side

socket.emit('executecommand', {'execute': function(param){
    console.log(param);
}});

但是,当我尝试时,客户端接收到一个空的json对象(data == {}),然后抛出异常,因为数据不包含任何执行方法。这是怎么了?


问题答案:

JSON不支持包含function定义/表达式。

相反,您可以做的是commands使用所需的functions 定义一个对象,然后传递一个commandName

// client-side

var commands = {
    log: function (param) {
        console.log(param);
    }
};

socket.on('executecommand', function(data){
    var a = 'foo';
    commands[data.commandName](a);
});



// server-side

socket.emit('executecommand', { commandName: 'log' });

您还可以使用fn.apply()传递参数并使用commandName以下命令检查匹配项in

// client-side
var commands = { /* ... */ };

socket.on('executecommand', function(data){
    if (data.commandName in commands) {
        commands[data.commandName].apply(null, data.arguments || []);
    } else {
        console.error('Unrecognized command', data.commandName);
    }
});



// server-side

socket.emit('executecommand', {
    commandName: 'log',
    arguments: [ 'foo' ]
});


 类似资料:
  • 问题内容: 在javascript中,存在创建匿名函数并立即调用它的常见模式(通常称为自执行匿名函数或立即调用的函数表达式)。 使用Java 8 lambda,是否有标准方法可以复制此行为?有点像。 这个问题基本上提出了相同的问题,但是对于Java7。我正在明确地寻找使用lambda的构造。 问题答案: 也不是没有声明类型。由于Java是静态类型的语言,并且函数不是一等公民,因此编译器需要知道la

  • 在javascript中,常见的模式是创建匿名函数并立即调用它(通常称为自动执行匿名函数或立即调用的函数表达式)。 对于Java8 lambdas,是否有复制这种行为的标准方法?类似于

  • 5.6. 匿名函数 拥有函数名的函数只能在包级语法块中被声明,通过函数字面量(function literal),我们可绕过这一限制,在任何表达式中表示一个函数值。函数字面量的语法和函数声明相似,区别在于func关键字后没有函数名。函数值字面量是一种表达式,它的值被成为匿名函数(anonymous function)。 函数字面量允许我们在使用函数时,再定义它。通过这种技巧,我们可以改写之前对st

  • 有没有想过定义一个很短的回调函数,但又不想用 def 的形式去写一个那么长的函数,那么有没有快捷方式呢? 答案是有的。 python 使用 lambda 来创建匿名函数,也就是不再使用 def 语句这样标准的形式定义一个函数。 匿名函数主要有以下特点: lambda 只是一个表达式,函数体比 def 简单很多。 lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封

  • 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。 在Python中,对匿名函数提供了有限支持。还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数: >>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81]

  • 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。 在Python中,对匿名函数提供了有限支持。还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数: >>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])) [1, 4, 9, 16, 25, 36, 49, 6