JavaScript - Объявление глобальной области для вложенной функции? - PullRequest
10 голосов
/ 04 марта 2011

Мои попытки дать глобальную область видимости для вложенной функции JavaScript не работают:

//DECLARE FUNCTION B IN GLOBAL SCOPE
function B;

function A() {

    //DEFINE FUNCTION B INSIDE NEST
    B() {
        alert("function B is running");
    }
}

//CALL FUNCTION B FROM GLOBAL SCOPE
B();

Это просто любопытство - вы правы, у меня нет действительно веской причины хотеть сделатьthis.

TIA - У меня нет учетной записи SO, чтобы отвечать на ваши ответы ...

Ответы [ 5 ]

15 голосов
/ 04 марта 2011

function B; просто генерирует синтаксическую ошибку.

Вы можете использовать выражение функции .Поскольку функции являются объектами первого класса, вы можете назначить функцию переменной:

var B; // declare (global) variable (outer scope)

function A() {
    // assign a function to it
    B = function() {
        alert("function B is running");
    };
}

// we have to call A otherwise it won't work anyway
A();
// call B
B();

Вы также можете позволить A вернуть функцию:

function A() {
    return function() {
        alert("function B is running");
    };
}

B = A();

Это создаст соотношениемежду A и B немного понятнее.

Конечно, вы всегда можете определить глобальную переменную, пропустив var, но вы должны использовать это очень осторожно.Используйте как можно меньше глобальных переменных.

function A() {
    B = function() {
        alert("function B is running");
    };
}

И держу пари, есть лучший способ сделать это, в зависимости от вашей реальной цели.


Подробнеео функциях и объеме функций.

3 голосов
/ 02 августа 2013

А как же:

function A() {
    window.B = function() {
        alert("function B is running");
    }
}
//CALL FUNCTION B FROM GLOBAL SCOPE
B();
2 голосов
/ 04 марта 2011

Вы можете сделать что-то вроде этого:

function outer() {
  function inner() {
    // ..
  }

  window['inner'] = inner;
}

Немного странно иметь прямую ссылку на "окно", поэтому вы можете сделать это (из глобального контекста):

(function (global) {
  function inner() {
    // code code code ...
  }

  global['inner'] = inner;
})(this);
0 голосов
/ 04 марта 2011

Вы близки, но не совсем корректны.

  1. Вы должны определить B как переменную и затем присвоить ей функцию.
  2. Также запустите A () передвыполнение B, иначе B будет неопределенным.Самый простой способ запустить его - это способ, который я покажу в своем примере кода.

Это наименьшее количество изменений в вашем коде, чтобы заставить его работать, как вы и просили:

var B;

(function A() {
    // define function B
    B = function() {
        alert("function B is running");
    }
})();

// call function B globally
B();
0 голосов
/ 04 марта 2011

Похоже, с вашим кодом есть несколько проблем

  1. Первая строка не является допустимым Javascript (JSLint согласен). Чтобы объявить неинициализированную переменную, используйте синтаксис var B;
  2. Код никогда не вызывает A для инициализации B, поэтому вызов B () вызывает неинициализированную переменную
  3. Я вполне уверен, что код для инициализации B внутри A также недопустим.

Попробуйте следующее

var B; // Establish B as a global scope variable

function A() {
  B = function() {
    alert('B is running');
  };
}

A(); // Call the function which will cause B to be initialized
B(); // Run B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...