【问题标题】:How does this left hand side assignment for a function call work in JScript?函数调用的左侧赋值如何在 JAVAScript 中工作?
【发布时间】:2020-08-05 15:21:11
【问题描述】:

我正在寻找一种使用 JScript 记录安装程序日志消息的方法,并偶然发现了这个答案:

How to debug an MSI Custom Action that is implemented in Javascript?

效果很好。但是,代码中有一些我无法弄清楚的有趣之处。在这种方法中:

// spool an informational message into the MSI log, if it is enabled. 
function LogMessage(msg) {
    var record = Session.Installer.CreateRecord(0);
    record.StringData(0) = "CustomAction:: " + msg;
    Session.Message(MsgKind.Log, record);
}

从语法/语义的角度来看,record.StringData(0) = "CustomAction:: " + msg; 行是如何工作的?在我看来,这是试图为函数调用的返回值分配一个值,这应该是非法的还是充其量是无操作?但它确实有效,并且该消息已打印在日志中。

我错过了什么?

【问题讨论】:

  • @JavaScript 这不适用于 JavaScript,上面的方法无论如何都会失败;然而,在 JScript 中,微软创建了一些“特殊行为”,允许在一些特殊对象上这样做。

标签: javascript jscript advanced-installer


【解决方案1】:

这是一种访问列表的 JScript 方式,而不是实际的函数。因此它不会抛出Invalid left-hand side in assignment

StringData 是一个值列表。您实际设置的是0 索引的值。这就像使用arr[0] = 'xyz' 将值设置为数组一样。在您的示例中,您也可以省略它:

record.StringData = "CustomAction:: " + msg;

语法

propVal = Record.StringData
Record.StringData = propVal 

属性值

记录中值的必填字段编号,从 1 开始。

备注

不存在的字段的返回值为空字符串。要将记录字符串字段设置为空,请使用空变量或空字符串。尝试将值存储在不存在的字段中会导致错误。

来源:Patrick

【讨论】:

  • 这很奇怪,除了 Patrick 的回答之外,我还没有看到任何提到 () 在任何地方用作索引运算符。似乎是一个非常晦涩的功能/语法
  • @Chin:这也是我自己找到的唯一参考资料。我记得它在 ASPVBVB.Net 中很常见。 x.item() 通常有一个简写,但我找不到任何实际的来源或实现参考。
猜你喜欢
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多