2016-07-16 13 views
-1

我通過對演示類的typescript代碼的編譯版本進行了一些修改得到了以下代碼。圓括號包裝函數(IIFE)上的新運算符

function f() { 
    function Demo() { 
     console.log("Inside constructor"); 
    } 
    return Demo; 
} 

var Demo = (f)(); 
console.log("Creating instance"); 
var demo = new Demo(); 

// Output 
// Creating instance 
// Inside constructor 

去除IIFE我拿到後,

function f() { 
    function Demo() { 
     console.log("Inside constructor"); 
    } 
    return Demo; 
} 

var Demo = f; 
console.log("Creating instance"); 
var demo = new Demo(); 

// Output 
// Creating instance 

在第一種情況下,在演示的調用執行構造函數。在第二種情況下,調用Demo不會執行構造函數。 new運營商在每種情況下的行爲如何?

+2

這不是關於'new'關鍵字,它是關於'VAR演示=(F)();''VS變種演示= F;' – Rayon

回答

3

var Demo = (f)();var Demo = f();相同。您請致電f並將返回值(演示功能)分配到Demo)。

var Demo = f;將f函數賦值爲Demo

new運算符的行爲方式相同,只是將其應用於不同的值。


去除IIFE

後有沒有IIFE在這裏所有。

的IIFE是你有一個函數表達式(你只有函數聲明),你立即()跟着它來調用它。

你有一個功能(f),你可以打電話或不打電話。

1

你沒有刪除IIFE,只需去掉一個函數調用(轉f()f)。

正確的變換看起來更像:

原始代碼:

function f() { 
    function Demo() { 
     console.log("Inside constructor"); 
    } 
    return Demo; 
} 

var Demo = f(); 

內嵌f

var Demo = (function f() { 
    function Demo() { 
     console.log("Inside constructor"); 
    } 
    return Demo; 
})(); 

內嵌Demo(以減少f到單一表達用於下一步驟):

var Demo = (function f() { 
    return function Demo() { 
     console.log("Inside constructor"); 
    }; 
})(); 

刪除IIFE(即轉function() { return ...; }()...):

var Demo = function Demo() { 
    console.log("Inside constructor"); 
};