Проверка ограничений внешнего ключа занимает некоторое процессорное время, таким образом, некоторые люди опускают внешние ключи для получения некоторой дополнительной производительности.
Вы можете добиться желаемого эффекта, воспользовавшись тем фактом, что Javascript передает объекты по ссылке:
var o = { };
(function (p) {
p.fn = function () {
alert('test');
};
})(o);
o.fn();
Лучше использовать язык по назначению, чем пытаться подогнать его под идиомы, которые имеют смысл только в языке, построенном в соответствии с другим набором принципов.
var o = (function(p) {
return function() {
alert('test');
};
})();
o();
Когда вы передаете переменную o в вашем примере, вы передаете неопределенное значение, а не ссылку ни на что. Что вам нужно сделать, так это отправить родительский объект. В этом случае объект окна (при условии, что вы используете браузер).
(function (p, name) {
p[name] = function() {
alert('test');
};
})(window, "o");
o();
Это передает объект окна и имя вашей новой функции. Затем он назначает вашу функцию окну, и теперь оно доступно для вызова. Однако, если вы не собираетесь использовать замыкания, я бы предложил просто назначить функцию напрямую.
function o() {
alert('test');
};
o();