Подведем итоги:
Пойдем от самого очевидного и
не спортивного
Самое очевидное решение, заключается в том, что я случайно забыл упомянуть
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к/час полезней всяких конференций (на которых уже второй год эту тему мусолят), последний вариант, самое то.
Появился стимул к прочтению нового стандарта?