2016-11-30 8 views
0

次のようにJavaScriptでコーディングすることも可能である。javascript、変数は値でも関数でもありますか?

var foo = function(n) { //magic codes }; 
var bar = foo(2); 

bar + 2  // result: 4 
bar(2)  // result: 4 
bar(2)(2) // result: 6 
+1

'bar + 2 = 4'の場合、' bar.toString'を上書きして '2'を返すようにする必要がありますが、良いアイデアのようには聞こえません。 – Kaiido

+0

あなたはちょっとでもこの記事をチェックすることができますhttp://www.2ality.com/2011/12/fake-operator-overloading.html –

答えて

4

変数には1つの値しか格納できません。その値は関数になります。

オブジェクトには、あなたがしようとしているものに近づくためにハッキングされる可能性があるtoString()メソッドがあります。

function myFactory(value) { 
 
    function myFunction(add) { 
 
    return myFactory(value + add); 
 
    } 
 
    myFunction.toString = function() { 
 
    return value; 
 
    }; 
 
    return myFunction; 
 
} 
 

 
var bar = myFactory(2); 
 

 
console.log(bar + 2); 
 
console.log(bar(2)); 
 
console.log(bar(2)(2));

これは、当然のことながら、恐ろしいです。

2

カリー化関数を返すことによって、JavaScriptで行うことができます。 デフォルトでは、変数は値(リテラルまたは関数の結果)または関数宣言のいずれかです。

function add(number) { 
 
     return function(number2) { 
 
     return number + number2; 
 
     } 
 
    } 
 

 
    console.log(add(5)(6));

あなたがbar + 2を説明したものを達成するための方法がありますが、それは型破りだし、私の意見では、あなたはJavascriptでそれらを使用しないでください。

+1

'add + 2'は' 4'を与えません。コード。 – Quentin

0

私はQuetinの答えに触発されてしまったと私は奇妙出てくるんログの結果を認めるが、意図したとおり、それは動作しますvalueOf財産

var foo = function(n) { 
 
    var fn = function(x) { 
 
    return foo(n + x); 
 
    }; 
 

 
    fn.valueOf = function() { 
 
    return n; 
 
    }; 
 

 
    return fn; 
 
} 
 

 
var bar = foo(2); 
 

 
console.log(bar + 2 === 4, bar); 
 
console.log(bar(2) === 4, bar(2)); 
 
console.log(bar(2)(2) === 6, bar(2)(2));

を見つけました。

関連する問題