Запустить функцию внутри другой области видимости - PullRequest
3 голосов
/ 08 сентября 2011

Я пытаюсь не допустить наличия очень длинного блока кода внутри оператора if, поэтому я пытаюсь вызвать другую функцию в текущей области:

var f = function(){ alert(a); };

(function(){
    var a = "abc.";
    f(); //undefined
    eval("("+f+")()"); //this works, but eval is evil
})();

Я, вероятно, упускаю что-то очень простое в сферах или даже в других (лучших) способах приблизиться ко всему, но я не могу понять, что это такое. Есть идеи, как это сделать? Я не хочу передавать нужные мне переменные через аргументы функции.

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 08 сентября 2011

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

Таким образом, в вашем случае, если вы поместите определение var f = ... в немедленно выполняемую функцию в скобках, оно будет в той же области видимости, что и переменная a. Я не уверен, насколько это соответствует заявлению if, которое вы упомянули, но не включили в пример кода, но вы можете сделать что-то вроде этого:

(function(){
  var f = function(){ alert(a); };

  // other code here if you have any
  var a;

  if ("your if condition" == "something") {
    a = "abc.";
    f();
  }
})();

Или просто объявите a в том же месте, которое вы объявите f.

0 голосов
/ 01 марта 2015

Удивлен, никто не сказал этого. Это то, что я бы сделал

function sayhi () {
    alert("hi " + this.a);
}

(function () {
    this.a = "foo";
    sayhi.call(this);
}());
0 голосов
/ 08 сентября 2011

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

var f = function(a){ alert(a); };

(function(){
    var a = "abc.";
    f(a); //passing it the reference to a
})();

Редактировать: Хорошо, если вы действительно не хотите передавать переменную. Вам нужно сначала установить a в глобальной области видимости. При использовании var внутри функции вы создаете переменную, локальную для этой функции. оставьте var, и вы просто обновляете глобальную версию.

var f = function(){ alert(a); };
var a = ""; // declare a in global scope

(function(){
    a = "abc."; // dont use var, we just update the global scope.
    f(); // F runs and grabs a from global scope
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...