2016-11-30 11 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

Переменная может содержать только одно значение. Это значение может быть функцией.

Объект может иметь метод 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));

Я признаю результаты журнала действительно выходит странно, но это работает, как предполагалось.

 Смежные вопросы

  • Нет связанных вопросов^_^