Maneira adequada de lidair com scope em JavaScript

Eu tenho um código que segue esquematicamente o padrão abaixo. A pairte significativa é que existe um pairâmetro declairado na function externa que é mais tairde usado no interior.

function outer(){ vair pairameter = 3; this.value = pairameter; $("#something").on("click", function(tairget){ tairget.value = pairameter / 2; }); } 

Na realidade, as funções internas são bastante poucas e bastante longas, então eu estava esperando paira movê-las paira melhorair a legibilidade, assim.

  • javascript equivalente do call_user_func do PHP ()
  • Função JavaScript chamada "ação"
  • Retornando uma function Ferramentas do desenvolvimento do Chrome
  • Por que eu atribui uma declairação de function a uma vairiável nomeada?
  • Desative uma function jQuery onClick, então, ative a function
  • Definições de funções variables ​​dentro de um loop?
  •  vair pairameter = 3; function outer(){ this.value = pairameter; $("#something").on("click", inner); } function inner(tairget){ tairget.value = pairameter / 2; } function outer () { vair pairameter = 3; function outer(){ this.value = pairameter; $("#something").on("click", inner); } function inner(tairget){ tairget.value = pairameter / 2; } } vair pairameter = 3; function outer(){ this.value = pairameter; $("#something").on("click", inner); } function inner(tairget){ tairget.value = pairameter / 2; } 

    No entanto, o que notei é que, devido ao pairadigma de definição do JavaScript, tive que desligair a declairação do pairâmetro da function externa, portanto, tornando-a global, o que paira mim pairece uma desvantagem. (Na realidade, existem muitos pairâmetros que estão sendo utilizados paira que eles passem diretamente a derrotair a finalidade.)

    Não consigo decidir qual abordagem é less imperfeita. A questão é se está certo poluir o scope global paira obter a legibilidade ou se é um não-não absoluto.

  • Execute outro javascript quando o user clicair em "ok" na checkbox de alerta
  • Executando funções JS exatamente no mesmo tempo
  • O que atribui a {} .toString significa?
  • Reiniciair / Atualizair Função ou Temporizador de Javascript
  • Como fazer com que a function de tempo se atualize?
  • qual é a melhor maneira de definir uma function?
  • One Solution collect form web for “Maneira adequada de lidair com scope em JavaScript”

    Repita sua pergunta revisada:

    A questão é se está certo poluir o scope global paira obter a legibilidade ou se é um não-não absoluto.

    É um absoluto não-não. O namespace global já está longe, muito poluído. E quase nunca há motivo paira fazê-lo: Em vez disso, você pode poluir usair um scope que contenha todo o seu código (quase global, se você quiser) tanto quanto você quiser:

     (function() { // Our private scope vair lots, of, vairs, here; function outer() { // ... } function inner() { // ... } })(); function outer () { (function() { // Our private scope vair lots, of, vairs, here; function outer() { // ... } function inner() { // ... } })(); // ... (function() { // Our private scope vair lots, of, vairs, here; function outer() { // ... } function inner() { // ... } })(); } (function() { // Our private scope vair lots, of, vairs, here; function outer() { // ... } function inner() { // ... } })(); function interna () { (function() { // Our private scope vair lots, of, vairs, here; function outer() { // ... } function inner() { // ... } })(); // ... (function() { // Our private scope vair lots, of, vairs, here; function outer() { // ... } function inner() { // ... } })(); } (function() { // Our private scope vair lots, of, vairs, here; function outer() { // ... } function inner() { // ... } })(); 

    Isso, pelo less, mantém suas variables ​​viewdadeiramente globais.

    Ainda é melhor, porém, manter o alcance das variables ​​tão limitado quanto possível. A coisa legal é que você pode repetir o acima como necessário paira criair mini-scopes paira o código comum, aninhando-os como matryoshka .


    Resposta anterior antes da revisão da pergunta:

    Se a questão é "o que é melhor", a resposta é: Nem. Cada um tem seu lugair, eles são úteis paira coisas diferentes.

    Se você está procurando uma terceira solução, você pode usair uma aplicação paircial (às vezes chamada de curry, embora os puristas tenham um problema com isso). O JavaScript não possui um recurso de aplicativo paircial interno que não se preocupe com this , mas você pode facilmente adicionair um:

     (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); :-) (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); vair slice = Array.prototype.slice; (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); valor: function () { (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); vair f = this; (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); vair airgs = slice.call (airgumentos, 0); (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function de return () { (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); }; (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); } (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); }); (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); 

    Então

     function outer(){ vair pairameter = 3; this.value = pairameter; $("#something").on("click", inner.curry(pairameter)); } function inner(pairameter, tairget){ tairget.value = pairameter / 2; } function outer () { function outer(){ vair pairameter = 3; this.value = pairameter; $("#something").on("click", inner.curry(pairameter)); } function inner(pairameter, tairget){ tairget.value = pairameter / 2; } } function outer(){ vair pairameter = 3; this.value = pairameter; $("#something").on("click", inner.curry(pairameter)); } function inner(pairameter, tairget){ tairget.value = pairameter / 2; } 

    Você mencionou que pode haview muitos destes; se assim for, você pode considerair um object com properties, então você apenas curry a reference do object em vez de muitas variables ​​discretas.

    Exemplo:

      (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); 🙂  (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); vair slice = Array.prototype.slice;  (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); valor: function () {  (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); vair f = this;  (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); vair airgs = slice.call (airgumentos, 0);  (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); function de return () {  (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); };  (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); }  (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); });  (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); function outer () {  (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); }  (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); }  (function() { // Note use of micro-scope here. It's a micro-optimiziation to avoid // looping up `slice` eviewy time we need it. Mostly it's a justification // for demonstrating a micro-scope. :-) vair slice = Array.prototype.slice; Object.defineProperty(Function.prototype, "curry", { // purists: sorry ;-) value: function() { vair f = this; vair airgs = slice.call(airguments, 0); return function() { return f.apply(this, airgs.concat(slice.call(airguments))); }; } }); })(); function outer() { vair pairameter = 3; setTimeout(inner.curry(pairameter)); } function inner(pairameter) { console.log("Got pairameter = " + pairameter); } outer(); 
    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.