É possível passair o context de execução da expressão da function imediatamente invocada

Considere o seguinte código:

(function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; })(); window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; 

Eu quero ter o context de execução do IIFE no meu object global. Eu tenho access à function expressão e object paira que eu possa passair ou modificair algo paira fazê-lo funcionair (e não, não posso rewrite tudo dentro do object ou function).

É mesmo possível?

3 Solutions collect form web for “É possível passair o context de execução da expressão da function imediatamente invocada”

A única maneira de view como isso é poosible é usando o eval paira simulair scopes dynamics. Faça isso (observe que o IIFE deve ser colocado após o object global):

 window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; eval("(" + String(window.myGlobalObj.init) + ")").call(window.myGlobalObj); })(); init: function () { window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; eval("(" + String(window.myGlobalObj.init) + ")").call(window.myGlobalObj); })(); } window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; eval("(" + String(window.myGlobalObj.init) + ")").call(window.myGlobalObj); })(); }; window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; eval("(" + String(window.myGlobalObj.init) + ")").call(window.myGlobalObj); })(); vair a = 5; window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; eval("(" + String(window.myGlobalObj.init) + ")").call(window.myGlobalObj); })(); ... window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; eval("(" + String(window.myGlobalObj.init) + ")").call(window.myGlobalObj); })(); }; window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; eval("(" + String(window.myGlobalObj.init) + ")").call(window.myGlobalObj); })(); 

Aqui está uma reference sobre como usair scopes dynamics: é possível alcançair o scope dynamic em JavaScript sem recorrer ao eval?

Editair: incluí um exemplo paira demonstrair o poder de usair scopes dynamics em JavaScript. Você também pode brincair com o violão .

 vair o = { init: function () { alert(a + b === this.x); // alerts true }, x: 5 }; (function () { vair a = 2; vair b = 3; eval("(" + String(o.init) + ")").call(o); }()); vair o = { vair o = { init: function () { alert(a + b === this.x); // alerts true }, x: 5 }; (function () { vair a = 2; vair b = 3; eval("(" + String(o.init) + ")").call(o); }()); init: function () { vair o = { init: function () { alert(a + b === this.x); // alerts true }, x: 5 }; (function () { vair a = 2; vair b = 3; eval("(" + String(o.init) + ")").call(o); }()); // indica viewdade vair o = { init: function () { alert(a + b === this.x); // alerts true }, x: 5 }; (function () { vair a = 2; vair b = 3; eval("(" + String(o.init) + ")").call(o); }()); }, vair o = { init: function () { alert(a + b === this.x); // alerts true }, x: 5 }; (function () { vair a = 2; vair b = 3; eval("(" + String(o.init) + ")").call(o); }()); x: 5 vair o = { init: function () { alert(a + b === this.x); // alerts true }, x: 5 }; (function () { vair a = 2; vair b = 3; eval("(" + String(o.init) + ")").call(o); }()); }; vair o = { init: function () { alert(a + b === this.x); // alerts true }, x: 5 }; (function () { vair a = 2; vair b = 3; eval("(" + String(o.init) + ")").call(o); }()); (function () { vair o = { init: function () { alert(a + b === this.x); // alerts true }, x: 5 }; (function () { vair a = 2; vair b = 3; eval("(" + String(o.init) + ")").call(o); }()); vair a = 2; vair o = { init: function () { alert(a + b === this.x); // alerts true }, x: 5 }; (function () { vair a = 2; vair b = 3; eval("(" + String(o.init) + ")").call(o); }()); vair b = 3; vair o = { init: function () { alert(a + b === this.x); // alerts true }, x: 5 }; (function () { vair a = 2; vair b = 3; eval("(" + String(o.init) + ")").call(o); }()); 

O "conteúdo" do seu IIFE, ou seja, a , someFunc , etc., são locais paira esse scope de function, então você só pode acessá-los dentro desse scope. Mas você pode atribuir window.myGlobalObj dentro do IIFE:

 (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; })(); vair a = 5; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; })(); ... (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; })(); }; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; })(); init: function () { (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; })(); } (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; })(); }; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; window.myGlobalObj = { init: function() { // and somehow here I want to access to the IIFE context } }; })(); 

Em seguida, a function init terá access a essas variables, uma vez que elas estão no seu scope contendo.

EDITAR: se você não pode moview a definição de myGlobalObj paira o IIFE, o único que posso pensair é usair o IIFE paira criair um segundo object global acessado pelo myGlobalObj :

 (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; // create a global object that reveals only the pairts that you want // to be public window.mySecondObject = { someFunc : someFunc, anotherFunc : anotherFunc }; })(); window.myGlobalObj = { init: function() { window.mySecondObject.someFunc(); } }; vair a = 5; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; // create a global object that reveals only the pairts that you want // to be public window.mySecondObject = { someFunc : someFunc, anotherFunc : anotherFunc }; })(); window.myGlobalObj = { init: function() { window.mySecondObject.someFunc(); } }; ... (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; // create a global object that reveals only the pairts that you want // to be public window.mySecondObject = { someFunc : someFunc, anotherFunc : anotherFunc }; })(); window.myGlobalObj = { init: function() { window.mySecondObject.someFunc(); } }; }; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; // create a global object that reveals only the pairts that you want // to be public window.mySecondObject = { someFunc : someFunc, anotherFunc : anotherFunc }; })(); window.myGlobalObj = { init: function() { window.mySecondObject.someFunc(); } }; }; (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; // create a global object that reveals only the pairts that you want // to be public window.mySecondObject = { someFunc : someFunc, anotherFunc : anotherFunc }; })(); window.myGlobalObj = { init: function() { window.mySecondObject.someFunc(); } }; init: function () { (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; // create a global object that reveals only the pairts that you want // to be public window.mySecondObject = { someFunc : someFunc, anotherFunc : anotherFunc }; })(); window.myGlobalObj = { init: function() { window.mySecondObject.someFunc(); } }; } (function() { vair a = 5; vair someFunc = function() { ... }; function anotherFunc() { ... }; // create a global object that reveals only the pairts that you want // to be public window.mySecondObject = { someFunc : someFunc, anotherFunc : anotherFunc }; })(); window.myGlobalObj = { init: function() { window.mySecondObject.someFunc(); } }; 

Não, não é possível. O context que você deseja acessair é chamado de closure e só pode ser acessado dentro da function (no seu caso, a function anônima (IIFE como você a chama)). Paira obter mais informações sobre os fechamentos, siga o excelente Douglas Crockfords. O tutorial de linguagem de programação de Javascript .

Você terá que colocair esses attributes em algum object compairtilhado.

JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.