理解`if(document.createEvent){..}`没有括号的函数调用?

时间:2016-09-28 14:20:00

标签: javascript

我有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返回什么?

3 个答案:

答案 0 :(得分:3)

  

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

尝试访问document对象上的属性。

该财产可能存在。它可能有价值。该值可能是对函数的引用。

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

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

  

document.createEvent返回什么内容?

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

答案 1 :(得分:2)

  

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

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

  

document.createEvent返回什么?

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

答案 2 :(得分:1)

1 - JavaScript具有 truthy falsy 值。诸如0,"",undefined,null之类的值是 falsy 值,而1,-1或" text"以及例如现有属性一个对象 truthy 。 (如果他们的价值不是假的!) 2-因为 createEvent document 对象的属性,所以代码片段基本上测试了该函数的存在性,这意味着它的存在是真实的。我假设此检查与浏览器兼容性和放大器有关。方法弃用。 您可以阅读here

中的详细信息