как передать переменную в пространство имен Javascript - PullRequest
1 голос
/ 15 декабря 2011

Я создал пространство имен Javascript следующим образом:

var MyApp = function() {
      return {
        someFunction : function(x) {}
             alert(MyApp.y);
      }
}();

Это позволяет мне сделать это:

MyApp.someFunction(x);

Я бы хотел сделать следующее:

MyApp.y = "test", чтобы моя someFunction могла получить доступ к этой переменной Y.

Есть идеи, как это решить? Я хотел бы сохранить свой синтаксис NS без изменений, чтобы было бы неплохо решение, которое работает с моим примером кода.

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Я хотел бы пойти с чем-то вроде этого:

var MyApp = function() {
    var _y = "default value";
    return {
        someFunction: function(x) {
            console.log(_y);
        },
        setY: function (y) {
            _y = y;
        }
    }
}();

Это будет означать, что можно безопасно вызвать MyApp.someFunction() перед присвоением значения y.Это также означает, что содержимое переменной поддерживается в пределах области имен, например

console.log(MyApp._y); // undefined

Вот как это можно использовать:

MyApp.someFunction(); // "default value"
MyApp.setY("new value");
MyApp.someFunction(); // "new value"
2 голосов
/ 15 декабря 2011

То, что вы описали, должно работать.(За исключением того, что у вас есть синтаксическая ошибка и неиспользуемый аргумент x.)

var MyApp = function() {
  return {
    someFunction : function(x) {
         alert(MyApp.y);
    }
  }
}();
MyApp.y = 'test';
MyApp.someFunction() // alerts 'test'

Другой подход состоит в том, чтобы рассматривать внешнюю функцию больше как конструктор и передавать y как замыкание:

var MyApp = (function (y) {
    return {
        y: y,
        someFunction: function () {
            alert(MyApp.y); // or alert(this.y)
        }
    }
} ('test'));
MyApp.someFunction(); // alerts 'test'
...