JavaScript中怎样不带括号的挪用函数

(1)作为组织器挪用

应用new关键字能够不带括号地挪用函数:


function Greet() {

    console.log('hello');

}

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

new操作符的语法为:


new constructor[([arguments])]

(2)隐性完成 toString 或许 valueOf 的挪用

另一个例子就能够隐性挪用toString或许valueOf要领:


var greet = {

    toString: function() {

         return 'hello';

    }

}



greet + ''; // 字符串衔接会强制性转化到String范例,如许就隐性挪用了toString

能够应用这类体式格局挪用恣意的函数:


function func() {

    console.log('hello');

}



var greet = {

    toString: func

}



greet + '';

或许运用 valueOf:


function func() {

    console.log('hello');

}



var greet = {

    valueOf: func

}



+greet;

假如要运用valueOf的话,能够在Function的原型中完成复写,如许也能完成一个函数的通报:


Function.prototype.valueOf = function() {

    this.call(this);

    // Optional improvement: avoid `NaN` issues when used in expressions.

    return 0; 

};

function greet() {

    console.log('hello');

}



+greet;

(3)Iterators

能够应用*操作符建立一个迭代器,然后鄙人一个元素被遍历的时刻就会被自动挪用了:


function* func() {

    console.log('hello');

}



var greet = {};

greet[Symbol.iterator] = func;



[...greet];

一般来说用迭代器的时刻都邑附带一个yield语句,但是在这边愿望挪用某个函数的时刻不一定要加上这个语句。上述代码中是末了一个语句挪用了函数,同时也能够应用解构赋值来举行挪用


[,] = greet;

或许运用for … of构造:


for ({} of greet);

(4)Getters


function func() {

    console.log('hello');

}



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



greet;

也能够应用Object.assign:


Object.assign(window, { get greet() {

    console.log('hello');

}}); 

greet;

全局将 window 对象替换成一个你自定义的全局对象。

(5)Tagged Template Literals

ES6中能够应用模板字符串的体式格局挪用:


function greet() {

    console.log('hello');

}



greet``;
    原文作者:王下邀月熊_Chevalier
    原文地址: https://segmentfault.com/a/1190000004599465
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞