2017-10-13 47 views
0

我想在JavaScript中構建一個系統爲ruby。如何自動檢測函數並返回一個值

例如,當我定義一個函數a時,如何可以調用a(不是a())並得到1

var a = function(){ 
    return 1; 
} 
console.log(a);//wanted result 1, not function(){...} 
console.log(a());//it's okay. 

我認爲它可以使用macro使捉迷藏之前,檢測a的功能,並自動切換到a()是可能的,但我沒有有任何想法,我怎麼能做到這一點。 請幫幫我。
更新:我發現一個函數檢測函數類型變量,但我不知道如何使用它。

function isFunction(functionToCheck) { 
var getType = {}; 
return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; 
} 
+0

不清楚你的意思是「JavaScript中的系統是紅寶石」。 – sawa

+0

我想用'a'而不是'a()'來得到1,@ Rajesh的回答是類似的 –

+0

你爲什麼要這麼做?這聽起來像你想改變語言。 – 2017-10-16 04:57:01

回答

3

您可以使用get對象的屬性來實現這一目標:

function getValue(str) { 
 
    return 'Hello ' + str; 
 
} 
 

 
function Person(fname, lname){ 
 
    this.fname = fname; 
 
    this.lname = lname; 
 
    Object.defineProperty(this, 'fullName', { 
 
    get: function(){ 
 
     return this.fname + ' ' + this.lname 
 
    } 
 
    }); 
 
    
 
    Object.defineProperty(this, 'greet', { 
 
    get: function(){ 
 
     return getValue(this.fullName) 
 
    } 
 
    }); 
 
} 
 

 
var p = new Person('foo', 'bar'); 
 
console.log(p.greet)

+0

太棒了!我從你身上找到了令人興奮的東西。 –

+0

注意,這些值(*'greet','fullName' *)確實有一個setter,所以'p.fullName ='bla''不會做任何事情。你也可以使用它來實現不變性。 – Rajesh

+0

我明白了,非常感謝。 –

0

一個簡單的方法是使用一個立即調用函數表達式來做到這一點。您包裝功能括號,然後添加一組()到最後。無論何時您致電a,其內部的功能將立即觸發。

var a = (function(){ 
return 1; 
})(); 
console.log(a) 
// will return 1 
+0

感謝您的努力,'console.log(a)'會返回1,但'console.log(a())'會返回什麼? –

+0

對不起,我一定誤解了你正在做的事情。我以爲你想調用'a'而不是'a()'。在我的例子中,a不是一個函數,它只是內部iife返回的值。 –

+0

我正在嘗試a和a()都可能 –

相關問題