调用不带括号的函数

调用不带括号的函数,第1张

调用不带括号函数

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

假设您已定义此函数:

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

然后,请按照以下方法在

greet
不带括号的情况下进行调用:

1.作为建设者

使用

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

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

从MDN的

new
oprator:

句法

 new constructor[([arguments])]
2.作为
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 }
2.b
valueOf
函数原型中的覆盖

您可以采用先前的想法来覆盖原型

valueOf
上的方法:
Function

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

完成此 *** 作后,您可以编写:

+greet;
3.作为发电机

您可以定义一个生成器函数(带有

*
),该函数返回一个迭代器。您可以使用传播语法或语法来调用它
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
块来管理异常。

4.作为吸气剂

@ jehna1对此有完整的答案,请给他功劳。这是在全局范围内调用无括号的函数的一种方法,从而避免了不建议使用的

__defineGetter__
方法。它
Object.defineProperty
改为使用。

我们需要为此创建原始

greet
函数的变体:

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

然后:

greet_get;

替换

window
为您的全局对象。

您可以调用原始

greet
函数而无需在全局对象上留下这样的痕迹:

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

但是有人可能会说我们在这里确实有括号(尽管它们没有参与实际的调用)。

5.作为标签功能

从ES6开始,您可以使用以下语法调用将其传递为模板文字的函数:

greet``;

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

6.作为代理处理程序

从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
7.作为实例检查器

定义后,

instanceof
运算符
@@hasInstance
在第二个 *** 作数上执行该方法:

1 instanceof { [Symbol.hasInstance]: greet } // triggers greet


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5566313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存