JavaScript中怎么不带括号的调用函数

(1)做为构造器调用express

利用new关键字能够不带括号地调用函数:函数

function Greet() {

    console.log('hello');

}

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

new操做符的语法为:this

new constructor[([arguments])]

(2)隐性实现 toString 或者 valueOf 的调用prototype

另外一个例子就能够隐性调用toString或者valueOf方法:code

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的原型中完成复写,这样也能完成一个函数的传递:get

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原型

能够利用*操做符建立一个迭代器,而后在下一个元素被遍历的时候就会被自动调用了:it

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``;
相关文章
相关标签/搜索