2017-10-13 46 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()都可能 –

相关问题