【问题标题】:Understanding `if (document.createEvent) {..}` function call without parentheses?理解没有括号的`if(document.createEvent){..}`函数调用?
【发布时间】:2016-09-28 14:20:00
【问题描述】:

我有来自here 的以下脚本:

function download(filename, text) {
    var pom = document.createElement('a');
    pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
    pom.setAttribute('download', filename);

    if (document.createEvent) {
        var event = document.createEvent('MouseEvents');
        event.initEvent('click', true, true);
        pom.dispatchEvent(event);
    }
    else {
        pom.click();
    }
}

download('test.txt', 'Hello world!');

现在我不明白if (document.createEvent) 的用法:

我阅读了In JavaScript, does it make a difference if I call a function with parentheses? 问题的答案并阅读了其他一些问题。

在大多数示例中是某种引用,例如window.onload = initAll;var ret = Multiply;,但这里显然不是这种情况。对我来说最有趣的例子是:

function Multiply(operator, operand) {
    return operator * operand;
}
var operator = 3;
var operand = 4;
var ret = Multiply;

这里,根据作者的说法,Multiply 没有被执行,ret 引用了函数Multiply

另外here 声明调用不带括号的函数是一个引用。

但这让我更加困惑,因为对我来说,引用 document.createEvent(这是一个创建事件的函数)没有意义。

关于函数document.createEvent()here的文档没有指出没有参数的用法。

所以,请给我黑暗的大脑带来一些光明。 感谢您的帮助。

问题(简​​短):

  • document.createEvent 是函数调用还是引用?
  • document.createEvent 返回什么?

【问题讨论】:

  • 检查document.createEvent函数是否存在。它根本不叫它。在 Javascript 中,函数是一等对象,可以这样对待。
  • 它正在检查浏览器是否支持document.createEvent,如果支持则使用它,否则使用不同的方法。
  • JavaScript If statement condition with no operator? What does it do?  的可能副本—— 这完全是相同的技术。

标签: javascript


【解决方案1】:

document.createEvent 是函数调用还是引用?

这是试图访问 document 对象上的属性。

该属性可能存在。它可能有一个价值。该值可能是对函数的引用。

如果所有这些都是这样,那么它将是一个真值(并且if 块将运行)。如果它不存在,它将是一个错误值(else 块将运行)。

这是测试浏览器是否支持该功能。

document.createEvent 返回什么?

财产的价值。如果浏览器支持createEvent,那么它将作为函数求值,这是一个真值。

【讨论】:

    【解决方案2】:

    document.createEvent 是函数调用还是引用?

    这是一个表示document 对象属性的表达式。人们期望它的值是对将创建事件的Function 对象的引用,但它也可能是undefined

    document.createEvent 返回什么?

    作为一个表达式,它计算为所述属性的当前值。

    【讨论】:

      【解决方案3】:

      1 - JavaScript 具有 truthyfalsy 值。 0、""、undefined、null 等值是 falsy 值,而 1、-1 或 "text",例如对象的现有属性是 truthy >。 (如果它们的值不是虚假的!) 2- 由于 createEventdocument 对象的一个​​属性,所以代码 sn-p 基本上测试了该函数的存在,这意味着它的存在是真实的。我认为此检查与浏览器兼容性和方法弃用有关。 详情可以阅读here

      【讨论】:

      • 我认为这个答案是最好的,因为它参考了让 if 语句评估“真”的返回值是可接受的。但我赞成其他答案,因为一切都很好。谢谢。
      猜你喜欢
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      相关资源
      最近更新 更多