今天有人告诉我,可以不带括号地调用一个函数。我能想到的唯一方法是使用类似apply
或的函数call
。
f.apply(this);
f.call(this);
但是,这些都需要apply
加上括号,然后call
放在第一个平方上。我还考虑了将函数传递给某种事件处理程序的想法,例如setTimeout
:
setTimeout(f, 500);
但是,问题就变成了“如何在setTimeout
没有括号的情况下调用?”
那么这个谜题的解决方案是什么?如何在不使用括号的情况下调用Javascript函数?
有多种不带括号的函数调用方法。
假设您已定义此函数:
function greet() {
console.log('hello');
}
然后,请按照以下方法在greet
不带括号的情况下进行调用:
使用new
可以调用不带括号的函数:
new greet; // parentheses are optional in this construct.
从MDN的new
oprator:
句法
new constructor[([arguments])]
toString
或valueOf
实施toString
并且valueOf
是特殊的方法:在需要进行转换时会隐式调用它们:
var obj = {
toString: function() {
return 'hello';
}
}
'' + obj; // concatenation forces cast to string and call to toString.
您可以(ab)使用此模式调用greet
而不带括号:
'' + { toString: greet };
或搭配valueOf
:
+{ valueOf: greet };
valueOf
并且toString
实际上是从@@ toPrimitive方法调用的(自ES6起),因此您也可以实现
该 方法:
+{ [Symbol.toPrimitive]: greet }
"" + { [Symbol.toPrimitive]: greet }
valueOf
函数原型中的覆盖您可以采用先前的想法来覆盖原型valueOf
上的方法:Function
Function.prototype.valueOf = function() {
this.call(this);
// Optional improvement: avoid `NaN` issues when used in expressions.
return 0;
};
完成此操作后,您可以编写:
+greet;
您可以定义一个生成器函数(带有*
),该函数返回一个迭代器。您可以使用传播语法或语法来调用它for...of
。
首先,我们需要原始greet
函数的生成器变体:
function* greet_gen() {
console.log('hello');
}
然后,通过定义@@ iterator方法,将其命名为无括号:
[...{ [Symbol.iterator]: greet_gen }];
通常,生成器会在yield
某个地方有一个关键字,但是不需要调用该函数。
最后一条语句调用该函数,但是也可以通过解构来完成:
[,] = { [Symbol.iterator]: greet_gen };
或for ... of
结构,但具有自己的括号:
for ({} of { [Symbol.iterator]: greet_gen });
请注意,您 也可以 使用原始greet
功能执行上述操作,但是在执行(在FF和Chrome上测试) 后
,它会在进程中触发异常greet
。您可以使用try...catch
块来管理异常。
@ jehna1对此有完整的答案,请给他功劳。这是在全局范围内调用无括号的函数的一种方法,从而避免了不建议使用的__defineGetter__
方法。它Object.defineProperty
改为使用。
我们需要为此创建原始greet
函数的变体:
Object.defineProperty(window, 'greet_get', { get: greet });
然后:
greet_get;
替换window
为您的全局对象。
您可以调用原始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函数/方法调用时需要。而且,它与带有参数的实例