Javascript вопрос внешней области - PullRequest
2 голосов
/ 30 августа 2011

Возможно ли получить доступ к объему функции?Я объясню лучше.

У меня есть функция, из которой я хочу получить доступ к области ее вызывающей функции.

function called() {
    // i want to access the calling outer function scope
}

function calling() {
    called();
}

явно called() функция может быть вызвана многими calling функций, а called() должен время от времени знать, какая функция вызывала его, `и обращаться к переменным и функциям области видимости.

Ответы [ 5 ]

5 голосов
/ 30 августа 2011

Нет, это невозможно.

Чтобы получить доступ к переменной из двух функций, вам нужно:

Объявить его в общей области

var the_variable;
function called() {
    // i want to access the calling outer function scope
}

function calling() {
    called();
}

Передать в качестве аргумента

function called(passed_variable) {
    return passed_variable;
}

function calling() {
    var some_variable;
    some_variable = called(some_variable);
}
2 голосов
/ 30 августа 2011

Вы должны передать любую соответствующую информацию в called() в качестве параметров:

function called(x, y, z) {
}

function calling() {
   var x = getX();
   var y = computeY();
   var z = retrieveZ();

   called(x, y, z);
}

Если вы ожидаете, что called будет делать разные вещи и получать различную контекстную информацию, в зависимости от того, кто ее вызывает, вам, вероятно, следует сделать это несколькими отдельными функциями.

1 голос
/ 30 августа 2011
function called(outterScope) {
  // outterScope is what you want
  x = outterScope.declaredVariable;
  outterScope.declaredFunction();
}

function calling() {
  this.declaredVariable = 0;
  this.declaredFunction = function() { // do something };

  var _self = this;
  called(_self);
}
0 голосов
/ 30 августа 2011

В зависимости от того, что вы хотите сделать, могут быть более эффективные способы, но если вам абсолютно необходимо прибегнуть к этому, вы можете узнать это через Function.caller :

function myFunc() {
   if (myFunc.caller == null) {
      return ("The function was called from the top!");
   } else
      return ("This function's caller was " + myFunc.caller);
}

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

Кроме того, вы не можете получить доступ к области или функциям функций вызывающей стороны. Его удобство в использовании ограничено выяснением того, кто вам звонил (полезно для регистрации или отслеживания).

0 голосов
/ 30 августа 2011

Нет,

если вам нужно использовать переменные из области вызова блока кода (пример функции)
Вы должны передать их в аргументах

или вы можете создать объект и получить доступ к свойствам в области объекта (через this.param_name)

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