当前位置: 首页 > 知识库问答 >
问题:

调用不带括号的函数

冯浩旷
2023-03-14

今天有人告诉我,可以调用没有括号的函数。我能想到的唯一方法是使用像应用调用这样的函数。

f.apply(this);
f.call(this);

但这些要求在applycall上加上括号,让我们处于第一步。我还考虑了将函数传递给某种事件处理程序的想法,例如setTimeout

setTimeout(f, 500);

但是问题变成了“如何在没有括号的情况下调用setTimeout?”

那么这个谜的答案是什么呢?如何在Javascript中调用函数而不使用括号?

共有3个答案

芮承运
2023-03-14

您可以使用getter和setter。

var h = {
  get ello () {
    alert("World");
  }
}

仅使用以下命令运行此脚本:

h.ello  // Fires up alert "world"

编辑:

我们甚至可以争论!

var h = {
  set ello (what) {
    alert("Hello " + what);
  }
}

h.ello = "world" // Fires up alert "Hello world"

编辑2:

您还可以定义无括号运行的全局函数:

window.__defineGetter__("hello", function() { alert("world"); });
hello;  // Fires up alert "world"

有了论据:

window.__defineSetter__("hello", function(what) { alert("Hello " + what); });
hello = "world";  // Fires up alert "Hello world"

免责声明:

正如@MonkeyZeus所说:永远不要在生产中使用这段代码,不管你的意图有多好。

司马庆
2023-03-14

最简单的方法是使用new运算符:

function f() {
  alert('hello');
}

new f;
杜嘉慕
2023-03-14

调用不带括号的函数有几种不同的方法。

假设已定义此函数:

function greet() {
    console.log('hello');
}

然后在这里遵循一些不带括号的调用greet的方法:

使用new可以调用不带括号的函数:

new greet; // parentheses are optional in this construct.

newoprator上的MDN:

语法

new constructor[([arguments])]

toStringvalueOf是特殊的方法:在需要转换时隐式调用它们:

var obj = {
    toString: function() {
         return 'hello';
    }
}

'' + obj; // concatenation forces cast to string and call to toString.

您可以(ab)使用此模式调用greet,无需括号:

'' + { toString: greet };

或具有值的

+{ valueOf: greet };

valueOftoString实际上是从@toPrimitive方法调用的(从ES6开始),因此您也可以实现该方法:

+{ [Symbol.toPrimitive]: greet }
"" + { [Symbol.toPrimitive]: greet }

您可以采用前面的方法覆盖函数原型上的valueOf方法:

Function.prototype.valueOf = function() {
    this.call(this);
    // Optional improvement: avoid `NaN` issues when used in expressions.
    return 0; 
};

完成后,您可以写:

+greet;

尽管下面有括号,但实际的触发调用没有括号。在博客“在JavaScript中调用方法,而不是真正调用它们”中了解更多关于这一点的信息

您可以定义一个生成器函数(使用*),它返回一个迭代器。您可以使用spread语法或for…of语法调用它。

首先,我们需要原始greet函数的生成器变体:

function* greet_gen() {
    console.log('hello');
}

然后我们通过定义@iterator方法来调用它,不带括号:

[...{ [Symbol.iterator]: greet_gen }];

通常,生成器在某个地方会有一个yield关键字,但调用函数并不需要它。

最后一条语句调用函数,但也可以通过分解结构来完成:

[,] = { [Symbol.iterator]: greet_gen };

或者一个用于。。。属于构造,但它有自己的括号:

for ({} of { [Symbol.iterator]: greet_gen });

请注意,您也可以使用原始的greet函数执行上述操作,但是在执行greet之后(在FF和Chrome上测试),它将在过程中触发异常。您可以使用一个try... cat块来管理异常。

@jehna1对此有一个完整的答案,所以给他信用。这里有一种在全局范围内调用函数圆括号的方法,避免了不建议使用的__defineGetter__方法。它使用Object.define属性代替。

我们需要为此创建原始greet函数的变体:

Object.defineProperty(window, 'greet_get', { get: greet });

然后呢:

greet_get;

将窗口替换为全局对象。

您可以调用原始的greet函数,而无需在全局对象上留下如下跟踪:

Object.defineProperty({}, 'greet', { get: greet }).greet;

但有人可能会说,我们这里确实有括号(尽管实际调用中没有括号)。

由于ES6,您可以使用以下语法调用传递模板文本的函数:

greet``;

请参阅“标记的模板文字”。

从ES6开始,您可以定义代理:

var proxy = new Proxy({}, { get: greet } );

然后读取任何属性值将调用greet

proxy._; // even if property not defined, it still triggers greet

这方面有很多变化。还有一个例子:

var proxy = new Proxy({}, { has: greet } );

1 in proxy; // triggers greet

instanceof运算符在定义第二个操作数时,对第二个操作数执行@@hasInstance方法:

1 instanceof { [Symbol.hasInstance]: greet } // triggers greet
 类似资料:
  • 今天有人告诉我,可以调用没有括号的函数。我能想到的唯一方法是使用像或这样的函数。 但这些要求在和上加上括号,让我们处于第一步。我还考虑了将函数传递给某种事件处理程序的想法,例如: 但是问题变成了“如何在没有括号的情况下调用?” 那么这个谜的答案是什么呢?如何在Javascript中调用函数而不使用括号?

  • 问题内容: 考虑以下: 此代码返回 鉴于get_value是一个函数,我希望执行停止并返回错误,但事实并非如此。有人可以解释为什么python解释器允许这种语法而不是引发属性错误,在我看来,这可以节省我宝贵的时间。 问题答案: 如前所述,函数和方法是一流的对象。您通过在末尾加上一些括号(括号)来 称呼 它们。但是看来您想要更多的动机来解释为什么python甚至允许我们这样做。我们为什么要关心函数是

  • 本文向大家介绍基于js里调用函数时,函数名带括号和不带括号的区别,包括了基于js里调用函数时,函数名带括号和不带括号的区别的使用技巧和注意事项,需要的朋友参考一下 示例代码: 如以上代码: aaa 是将 hi() 的运行结果赋值给它,即 return 返回的匿名函数,此时有一个闭包,则每次调用 aaa 时都访问的同一个 a,aaa() 第一次运行结果为 1,第二次为2 而 bbb 将是将 hi 这

  • 对于在C 11中调用模板函数需要什么,我有点困惑,在C 11中为模板参数提供默认值。 例如,假设我有以下模板化函数 我想在代码中的某个地方调用它。所有这些电话都有效吗? 它可以很好地编译GCC 4.7.2,但我不确定它是否完全正确。我猜我的不确定性可能来自要求使用空尖括号

  • 问题内容: 我注意到,如果使用许多不带括号的DataFrame函数,其行为似乎类似于“属性”,例如 这是如何完成的,是一种好的做法?这是Linux上的熊猫0.15.1 问题答案: 它们是不同的,因此不建议使用,它们清楚地表明这是一种方法并且恰好输出结果,而另一种则表明了预期的输出。 这就是为什么您不应该这样做的原因: 所以好吧,您没有使用括号正确地调用该方法并看到显示为有效的输出,但是如果您引用了

  • 问题内容: 我还没有找到任何官方文档。但是afaik,是否在没有括号的情况下使用我们的类实例化没有关系-只要不涉及参数,对吗? 要么 但是谁能告诉我性能是否有所不同?“更正确”的方法是哪一种?有任何官方文件吗? 问题答案: 性能上的任何差异将绝对可以忽略。 虽然这两种方式都很好,我个人更喜欢使用 ,因为通常情况下,一个方法 是 正在这里所说的,和PHP函数/方法调用时需要。而且,它与带有参数的实例