有多种不带括号的函数调用方法。
假设您已定义此函数:
function greet() { console.log('hello');}
然后,请按照以下方法在
greet不带括号的情况下进行调用:1.作为建设者
使用
new可以调用不带括号的函数:
new greet; // parentheses are optional in this construct.
从MDN的
newoprator:
句法
2.作为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起),因此您也可以实现
该 方法:
2.b+{ [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; };
完成此 *** 作后,您可以编写:
3.作为发电机+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块来管理异常。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
这有很多变化。再举一个例子:
7.作为实例检查器var proxy = new Proxy({}, { has: greet } );1 in proxy; // triggers greet
定义后,
instanceof运算符
@@hasInstance在第二个 *** 作数上执行该方法:
1 instanceof { [Symbol.hasInstance]: greet } // triggers greet
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)