我们可以使用net.createServer([options][,connectionListener])
来创建服务器。通常回调函数connectionListener
有一个参数client
,我观察到它是上下文中的套接字实例(在函数体中,客户端调用方法on()
,所以我判断它是一个套接字实例。)
var net = require('net')
var server = net.createServer(function(client){
client.on('data',function(data){
console.log('Client sent' + data.toString());
});
client.on('end',function(){
console.log('Client disconnect');
});
});
但与JAVA或C#不同,在定义此回调函数时,参数前面没有类型,程序如何知道参数类型是什么?
使用http.createServer()
创建服务器时的相同难题。
答案 0 :(得分:1)
JavaScript中的类型在运行时动态解析,而不是像其他语言那样在编译时静态解析。
所以问题的答案程序如何知道参数类型是什么:类型是运行时传递的内容。
但问题的答案程序员如何知道参数类型是什么:类型是文档中解释的内容。
API的文档是API开发人员和API使用者之间的合同。
答案 1 :(得分:1)
我认为这是关于静态类型价值的古老争论。我假设您已经知道JavaScript“不是静态类型语言”。但我怀疑你可能会问的是,“为什么有人想写这种代码。”
我认为发动战争有两种心态:
(我称之为“每种信件的一个邮箱”。你不需要检查信件,只有一种适合这个信箱。如果你有很多不同种类的信件,你会有很多不同类型的邮箱。)
(我称之为“大多数字母的一个邮箱”。字母的类型无关紧要,你检查它以查看你得到的东西,并决定是保留它还是扔掉它。您将拥有很少的邮箱,甚至可能只有一个,具体取决于)。
在我25年的编码中,我获得了Java语言认证,Microsoft Developer认证,Adobe ActionScript开发人员认证以及其他一些我甚至不记得的认证。我专业教过JavaScript,C#和ActionScript。所以我精通那些能够强大地实现类型系统的语言,而那些没有。
我的观察;严格遵守类型系统确实会导致开发人员创建过度设计的代码。重点是形式而非功能。这使得工程设计变得更加困难,随着时间的推移更难以改变,但更容易进行逆向工程。
但与此同时,完全放弃类型确实会导致开发人员创建代号不完整的代码。重点是功能而非形式。这使得工程设计更容易,随着时间的推移更容易更改,但更难以进行逆向工程。
要回到我的邮箱,有时一个通用邮箱很有意义。有时,拥有一种非常特殊的邮箱更有意义。
我相信,如果一种心态在所有方面都优于另一种心态,那么这种心态在很久以前就会赢得。我们都要用Java或者JavaScript(或多或少)编写代码,因为总是可以在所有上下文中构建比另一个更好的软件。
我认为有大量证据表明情况并非如此。 Java(静态类型的典型支持者)是从松散类型的“功能”语言添加功能(甚至演变成Scala之类的东西),而像JavaScript这样的语言正在整合来自静态类型“OOP”语言的功能,比如ES6类(甚至是演变成像TypeScript这样的超集。
查看原始代码:这些函数和事件处理程序是否可以从静态类型中受益?
也许。 “服务器”暗示了严格键入的明智之举。你不希望有任何意外。这里,一种邮箱是一种信件。这将使得更换客户端实现变得更加困难,但也许这是一件好事(或者不是,取决于)。也许有多种不同类型的createServer(clientTypeA),createServer(clientTypeB)API调用等(例如Java重载)是有意义的。
另一方面,查看事件处理程序。 “数据”对于严格键入是否有意义,或者将其设为“*”更为实际,并让代码检查它需要什么?在这里,多种字母的一个邮箱更具实用意义。
希望能够对此有所了解。我一直都在谈话。我很幸运能够接触到编程范围的两边,但是许多开发人员(特别是Java comp sci grads)都无法解决任何功能性编程的问题(即使这样说)像anon函数这样的东西是“不正确的”),或者在栅栏的另一边,无法以任何方式解除任何带有“僵硬”的东西。
恕我直言,两者都错了,两者都是对的。照常。你并不总是需要合同的刚性来有效地与别人合作或知道他们在做什么,事实上它可能只是妨碍了。但根据具体情况,拥有一个可能非常聪明。