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``;
相關文章
相關標籤/搜索