фальшивая функция локальных переменных - PullRequest
0 голосов
/ 04 июня 2011

Есть ли способ ввести локальную переменную "iWantThisHere" здесь, чтобы я мог вызвать obj.n ()

var obj = { 
    test: "sure", 
    n : function(){ console.log(iWantThisHere); }
};

я пробовал с:

function fake(methods){
    var F =  new Function('methods', "var iWantThisHere = 'u have it', obj = {}; for( var meth in methods){ obj[meth] = methods[meth] } return obj;");

    return F(methods); }

console.log(fake(obj), fake(obj).n());

Я не хочу использовать глобалы здесь. Представьте себе систему модулей, в которой каждый модуль использует, например, класс util, который определен, например, в объекте App. Так что я всегда должен напечатать, например, App.utils.map или что-то в этом роде. Было бы неплохо иметь ярлык для этой функции util, которая является локальной переменной в самом контексте модуля.

EDIT --- нет никакого способа сделать это ----

Ответы [ 3 ]

1 голос
/ 04 июня 2011

Введение замыкания:

var obj = (function(){
    var R = {};

    R.iWantThisHere = 5;

    R.log = function() {
        console.log(R.iWantThisHere);
    }

    return R;
})();

Демонстрация:

> obj.log()
5
> obj.iWantThisHere = 6
> obj.log()
6

Это наиболее распространенный (я бы сказал, рекомендованный) способ выполнения программирования на JavaScript, путем создания функций для ограничения переменныхв сферу.Это необходимо, потому что у javascript нет области видимости на уровне блока.

1 голос
/ 04 июня 2011

Есть какая-то конкретная причина, чтобы сделать это трудным путем? Почему бы просто не добавить аргумент к функции в obj.n?

var obj = { 
  test: "sure", 
  n : function(iWantThisHere){ console.log(iWantThisHere); }
};

obj.n("yeah");

Или даже проще (хотя область видимости становится все хуже):

var iWantThisHere = "dance time";
var obj = {
  test: "sure", 
  n : function(){ console.log(iWantThisHere); }
};
obj.n();

Или с закрытием, а также некоторые подробности о том, как вы разделяете их открытую и закрытую части:

var obj = (function() {
  var privateVariable = "i'm private";

  function privilegedMethod() {
  };

  return {
    iWantThisHere: "",
    test: "sure",
    n: function() {
      console.log(this.iWantThisHere);
    },
    publicVariable: "i'm public",
    publicMethod: function() {}
  };
})();

obj.iWantThisHere = "hi";
obj.n(); // logs "hi"
obj.addedMethod = function() { console.log("I've been added"); }
obj.addedMethod(); // logs "I've been added";
console.log(obj.privateVariable); // logs undefined (unavailable outside closure)
console.log(obj.publicVariable); // logs "i'm public"

Другие ответы также довольно хорошо охватывают нотацию закрытия. Но суть в том, что замыкания и ограниченные области действия были бы бессмысленными в JavaScript, если бы вы могли просто вводить новые переменные везде.

1 голос
/ 04 июня 2011

Если ваш вопрос: «Как я могу вставить новое именованное значение в уже существующую область?», Ответ таков: вы не можете. Ближайший вы можете прийти:

var obj = (function() {
  var iWantThisHere = "whatever";
  return {
    test: "sure",
    n: function() { var x = iWantThisHere + "yaay I have my special variable"; }
  };
})();

Это дает вам «obj», который есть у вас в исходном примере, плюс для любых функций, определенных в этом объекте, вы получаете доступ к «относительно глобальной» переменной, которую они все разделяют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...