在JavaScript中,'::'(双冒号)在事件处理程序中的作用是什么?

8

我看到这段代码,正在努力理解它是如何工作的。

<SCRIPT LANGUAGE=javascript> 

     function SpeechMikeControl::SPMEventButton(lDeviceID, EventId) {
        alert("lDeviceID=" + lDeviceID + ", EventId=" + EventId);
     }

</SCRIPT>

双冒号?这是从一个网页使用飞利浦语音麦克风得到的。

你知道这个双冒号代表什么意思吗?对我来说,它似乎是一种语法错误,但它可以工作!(至少在IE中)。


1
可能是What does ‘::’ (double colon) do in javascript?的重复问题。 - Pekka
3
不是重复。我找到了另一个链接,但它与我的问题无关。 - sproketboy
我不明白为什么这不是一个重复项。您上面的代码片段也会导致语法错误。 - Pekka
1
它适用于哪个IE版本?至少不适用于IE8。 - Álvaro González
4
我同意这不是重复问题——这两个问题可能都涉及JS中的双冒号,但是它们在语法使用上有显著不同。 - Spudley
6个回答

7
我在一些扫描的手册中找到了一个晦涩的参考资料,来自Microsoft Office Infopath 2003。它似乎是JScript语法:

双冒号用作脚本ID和事件名称之间的分隔符

我猜这不是Internet Explorer的ECMAScript实现的一部分(或者不再是),而是属于(或曾经属于)Microsoft Office的实现。


谢谢。看起来没问题。我猜测当IE看到这个结构时,会退回到JScript。 - sproketboy
1
更相关的参考资料应该是脚本事件,其中的语法如此答案所述。 - Zev Spitz

6
这是微软实现的Javascript语言扩展。其目的是为页面上引用的COM对象指定事件处理程序。 SpeechMikeControl 是 COM(或ActiveX)对象的全局作用域名称:
  • 使用OBJECT或其他具有id属性为SpeechMikeControl的元素,或
  • 在先前某处声明的JavaScript中使用全局变量SpeechMikeControl
SPMEventButton 是 COM 事件的名称,它将在不知道什么情况下由SpeechMikeControl对象引发。
双冒号是将函数体连接为控件事件处理程序的指令。

3
很确定这是语法错误。

@Dan,它不起作用。出于某种原因,您只是没有看到错误。也许IE正在隐藏它们-请注意IE8左下角的黄色感叹号。 - Pekka
这只是对观察者而言的语法错误。在寻找答案时,似乎确实是JScript语法... - Christian
1
在IE下这不是语法错误。请参见Scripting Events这里,以及答案这里 - Zev Spitz

3

正如在这个答案中所提到的

::是一个ES2016运算符,是bind的速记形式。本答案旨在帮助那些遇到::的人,因为ES2016规范并不适用于此问题所涉及的上下文。


这个问题是在2011年提出的。 - Guy Waldman
3
是的,现在ES2016中使用::,所以这个问题很可能经常出现在搜索引擎结果中。如我上面所提到的,这个答案并不是针对原来的问题,而是旨在告知那些寻找ES2016实现方法的人们。 - Dmase05
答案与问题没有实际关系,因为问题中的语法是一个函数声明,不可能与ES2016绑定有任何关系。 - Zev Spitz
2
我很感激这个答案,因为我一直在寻找关于ES2016中::的作用。搜索“::是什么”很困难,因为::不太容易被搜索到,所以我对这个答案非常有价值。 - Kevin Lamping

0
问题可能不是JavaScript中‘::’(双冒号)是什么意思?的重复,但答案是:这是语法错误。

在下面的代码中:

function SpeechMikeControl::SPMEventButton(lDeviceID, EventId) {

全局上下文中的关键字function在表达式开头表示函数声明。紧随其后必须是一个标识符,即函数名。名称后必须是一个开放分组运算符'(',形式参数列表和关闭分组运算符')'。因此,在function()之间只能有一个允许字符的单个标识符(不是保留字或未来保留字,但这里不是问题)。

“:”(冒号)字符是一个标点符号,不能出现在标识符中。因此,如果将代码视为javascript,则必须导致语法错误。

也许IE有一种扩展语言,我不了解ECMAScript是否允许,但我认为不会,因为它破坏其他实现。


1
在IE中这不是语法错误。请参考脚本事件此处,以及答案 - Zev Spitz
@ZevSpitz - 这个问题标记为JavaScript,而不是JScript。如果您发布一个回答,列出支持它的JScript版本以及相关的IE版本,以及Microsoft Edge是否支持它,那将更有帮助。 - RobG
1
这个问题标记为JavaScript,而不是JScript。好的,这很容易解决。但是,我说错了;在Microsoft JScript下是有效的(据我所知,所有版本都是如此),它可以在多个环境中使用--IE、WSH、经典ASP。 - Zev Spitz

0

我非常确定这不是有效的JavaScript语法。

如果它在IE中可以工作但在其他浏览器中无法工作,可能是因为IE将其视为另一种脚本语言(也许是VBScript?尽管我不记得它有双冒号运算符?不确定还有哪种语言可能会出现这种情况。)


IE运行JScript而不是“标准”Javascript,因此它识别的内容比你想象的要多 :) - Christian
它确实在IE和WSH的Javascript中具有特殊含义。请参见Scripting Events这里,以及答案这里 - Zev Spitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接