изменить глобальную область действия функции в JavaScript - PullRequest
0 голосов
/ 12 февраля 2010

Возможно ли следующее:

var someObject = {someProperty : "someValue"};
var someFunction = function() {
 someProperty = "anotherValue";
};

// what do I do here, in order to use
// someFunction to change someObject,
// without altering either of those things?

// directly accessing "someObject" in someFunction
// is not an option. e.g., none of this:
/*
   var someFunction = function() {
       someObject.someProperty = "anotherValue";
   };
*/

if(someObject.someProperty=="anotherValue") alert("Hooray!");

Если не в обычном JavaScript, возможно ли это в расширениях Mozilla для JavaScript для Firefox?

Спасибо.

Ответы [ 7 ]

1 голос
/ 12 февраля 2010

Для тех, кому интересно, самое близкое, что я нашел, это Components.utils.evalInSandbox Это определенно не идеально, но легко лучшая вещь для этой проблемы.

1 голос
/ 12 февраля 2010

Для чисто академических целей вот способ:

with (someObject) {
  eval('(' +someFunction.toString() + ')();');
}

Не используйте это в производственной среде!

[Редактировать]: Просто чтобы уточнить, вот как вы его используете.

var someObject = {someProperty : "someValue"};
var someFunction = function() {
 someProperty = "anotherValue";
};

with (someObject) {
  eval('(' +someFunction.toString() + ')();');
}

if(someObject.someProperty=="anotherValue") alert("Hooray!");

Это НЕ относится к некоторому объекту внутри некоторой функции.

0 голосов
/ 12 февраля 2010
var someObject = {someProperty : "someValue"};
with (someObject)
{
  window.someFunction = function() {
   someProperty = "anotherValue";
  };
}

if(someObject.someProperty=="anotherValue") alert("Hooray!");

Не самая лучшая практика кодирования, но она должна выполнять то, что вы хотите.

0 голосов
/ 12 февраля 2010

Нет. Это все о области видимости (окружение) и свойствах.

Когда вы говорите someObject = ... или someobject.whatever, вы говорите, что дайте мне someObject в ближайшей области видимости, а затем сделайте что-нибудь с этим.

Области применения гнезда. Функции создают новую область и захватывают окружающую область. Переменные в более близких областях могут скрывать переменные в окружающих областях. Ваша функция может видеть все в области, в которой она была объявлена, поэтому она может видеть someObject.

someProperty является частью пары ключ / значение в someObject. Ничто не может добраться до него, не пройдя someObject и не попросив его восстановить значение, сохраненное с помощью ключа someProperty.

0 голосов
/ 12 февраля 2010

Если вы готовы изменить свою функцию для ссылки this.someProperty вместо просто someProperty, тогда вы можете использовать apply или call:

var someFunction = function() {
  this.someProperty = "anotherValue";
};

someFunction.apply(someObject);
0 голосов
/ 12 февраля 2010
eval("someObject.someProperty='anotherValue'");

Будет ли это работать? Что вы считаете "прямым доступом к someObject" в someFunction? " Вам нужно каким-то образом получить доступ к некоторому объекту, если вы хотите изменить его свойство ...

0 голосов
/ 12 февраля 2010

Нет, ты не можешь.

var someFunction = function() {
    someProperty = "anotherValue";
};

Здесь someProperty - глобальная переменная (создается, если ранее к ней не обращались).

var someObject = {someProperty : "someValue"};

Здесь someProperty является ключом объекта (не переменной).

Таким образом, в каждом контексте токен someProperty ссылается на что-то другое и полностью независимое.

Функция не может изменить значение объекта без прямой ссылки или вызова другой функции для этого.

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