Проблемы с закрытием и методом, определенным в другом месте - PullRequest
2 голосов
/ 24 октября 2009

Я довольно новичок в Javascript, поэтому могу не использовать точную терминологию.

Предположим, что я определяю литерал объекта как таковой.

var myObj = { 
   someMethod:function() {
      //can we have access to "someValue" via closure?
      alert(someValue);
   }
}

И затем мы назначаем функцию другому объекту, как этот.

var myOtherObject  = {
   someOtherMethod:function() {
      var someValue = 'Hello World';

      //If we did this, then the function would have access to "someValue"
      this.aMethod = function() {
        alert(someValue);
      }

      //This does not work for "someMethod" to have access to "someValue"
      //this.someMethod = myObj.someMethod;

      //This does work, however I would like to avoid the use of eval()
      this.someMethod = eval("("+myObj.someMethod.toString()+")");

   }
}

Можно ли заставить myOtherObject.someMethod () работать без использования eval () , как указано выше?

1 Ответ

1 голос
/ 24 октября 2009

someValue является локальным для someOtherMethod и не может быть доступен для myObj.someMethod (). Есть два решения:

a) Передайте someValue в качестве параметра первому методу:

var myObj = { 
   someMethod:function(someValue) {
      alert(someValue);
   }
}
var myOtherObject  = {
   someOtherMethod:function() {
      var someValue = 'Hello World';
      // The next line illustrates the 'closure' concept
      // since someValue will exist in this newly created function
      this.someMethod = function () { myObj.someMethod(someValue); };
   }
}
myOtherObject.someOtherMethod();
myOtherObject.someMethod();

b) Хранить someValue как член самого объекта, а не как локальную переменную:

var myObj = { 
   someMethod:function() {
      alert(this.someValue);
   }
}
var myOtherObject  = {
   someOtherMethod:function() {
      this.someValue = 'Hello World';
      this.someMethod = myObj.someMethod;
   }
}
myOtherObject.someOtherMethod();
// 'this' in someMethod will here refer to the new myOtherObject
myOtherObject.someMethod();
...