Показать сообщение отдельно
  #52 (permalink)  
Старый 16.02.2012, 09:11
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Подведем итоги:

Пойдем от самого очевидного и не спортивного

Самое очевидное решение, заключается в том, что я случайно забыл упомянуть this (думаю что это решение не в счет).

1.
var foo = function () {
    var a = 1;

    function b() {
        return 2;
    }

    this.a = a;
    this.b = b;

}();

alert([a, b()]) //1, 2


Это то что должно прийти в голову вторым (простая перестановка):
2.
var foo = function () {
    var a = 1;

    function b() {
        return 2;
    }
    c = a;
    d = b;
}();

a = c;
b = d;

alert([a, b()]);


Это уже более грамотный ответ, т.к. не создаются глобальные переменные (хотя b и указывает на window):
3.
var foo = function () {
    var a = 1;

    function b() {
        return 2;
    }
    return {
        a : a,
        b : b
    };
}();

a = foo.a;
b = foo.b;

alert([a, b()]);


Незнаю почему, но только один человек догадался использовать toString/toSource, ведь это очевидно, вспомните тесты Яндекса
4.
var foo = function () {
    var a = 1;

    function b() {
        return 2;
    }
};

eval(foo.toString().match(/{([\s\S]+)}/)[1])

alert([a, b()]) //1,2

5.
Эталонное и самое неочевидное решение, использовать - Multiple-value returns из JavaScript 1.7 (работает начиная с Firefox 2).

var foo = function () {
    var a = 1;

    function b() {
        return 2;
    }
    return [a, b];
};

[a, b] = foo();

alert([a, b()]); //1, 2


Объсню почему последнее решение было взято за эталон.
А дело в том, то Multiple-value returns включены в будущий стандарт ES6, спецификация которого уже давно лежит на офсайте. Тем более те кто писал на Python или расширения для FF должны были это как-никак вспомнить.

Ну а так как товарищ vflash сказал, что общение с ним за 10к/час полезней всяких конференций (на которых уже второй год эту тему мусолят), последний вариант, самое то.

Появился стимул к прочтению нового стандарта?

Последний раз редактировалось monolithed, 16.02.2012 в 09:23.
Ответить с цитированием