Доступ к переменной снаружи функции в jQuery - PullRequest
1 голос
/ 04 ноября 2011

Пожалуйста, смотрите мой пример:

var AbcVar = "abc";

function Abc(AbcVar){
  console.log(AbcVar);
}

Это неправильный способ разрешения функции доступа external var?

Почему вывод console.log undefined?

Ответы [ 4 ]

5 голосов
/ 04 ноября 2011

Пора встретиться с мистером Скопингом.

Проще говоря, область видимости - это инкапсуляция переменных (обратите внимание, что в javascript функции также являются переменными.) Теперь, на мнимом языке, который я только что составил, символ { начинает область, а } заканчивает ее переменные определяются с простым равенством (например, x = 42):

{                                                                    |
    x = 42;                                                          |
    {                                           |                    |
        y = "I'm in an inner scope!";           |                    |
        x == 42; //true                         |                    |
        {                                  |    |                    |
            x == 42;                       |    |                    |
            y == "I'm in an inner scope!"; |    |                    |
                                           | x, y, z are defined     |
            z = "pyramid time!";           |    |                    |
            y = y + "...not";              |    | x, y are defined   | x is defined
        }                                  |    |                    |
        y == "I'm in an inner scope!...not";    |                    |
        //z is not defined                      |                    |
        x = 4;                                  |                    |
    }                                           |                    |
    x == 4;                                                          |
    //y is undefined                                                 |
    //z is undefined                                                 |
}                                                                    |

у javascript есть лексическая область видимости. Проще говоря, функции создают новую область видимости:

var x = 42;
(funciton () {
    x === 42;
    var y = 5;
})();
//y is undefined

Теперь есть дополнительное место, где можно создавать переменные, и это в аргументах функции. Две следующие функции ведут себя одинаково (arguments - псевдомассив, содержащий параметры, переданные в функцию):

function parameterfull(a, b, c) {
    //do stuff with a, b, c
}

function parameterless() {
    var a = arguments[0], b = arguments[1], c = arguments[2];
    //do stuff with a, b, c
}

Если вы не передадите аргумент, его значение будет undefined.

Теперь, используя вашу функцию и приведенный выше перевод:

var AbcVar = "abc";

function Abc() {
    var AbcVar = arguments[0];
    console.log(AbcVar);
}

Итак, теперь вы понимаете, почему AbcVar (иногда) undefined внутри функции.


tl; dr Параметр функции AbcVar переопределяет глобальную переменную AbcVar, и, поскольку вы не передали значение функции, оно undefined (но только внутри функция, глобальная AbcVar остается прежней.)

1 голос
/ 04 ноября 2011

Внутри функции AbcVar будет относиться к параметру AbcVar функции. Если вы не передадите какой-либо параметр, значение будет undefined.

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

0 голосов
/ 04 ноября 2011

привет, вы можете изменить это на

  var AbcVar = "abc";

        function Abc(bbb){

            console.log(AbcVar);

        }

вы можете получить доступ к внешнему глобальному var, если вы пишете внутри функции, она предполагает, что вроде;

var AbcVar = "abc";

            function Abc(var AbcVar){

                console.log(AbcVar);

            }

 so inside funciton AbcVar is new vaiable  and null ,it shadow global AbcVar
0 голосов
/ 04 ноября 2011

если вы запустили функцию, которую вы только что создали, и передали ей AbcVar,

console.log(AbcVar);

, она регистрирует "abc" как ожидается

Рассмотрим следующий код

var AbcVar = "abc";

function logVariable(passedIn){
  console.log(passedIn);
}

logVariable(AbcVar);

, который создает переменную, функцию для записи значения переменной, а затем передает переменную в регистратор, который регистрирует ее в консоли

Если вы заметили две строки на интерактивной консолипосле запуска функции логгера: abc с последующим undefined

console result

первая строка выводится при вызове console.log (), а вторая - значениечто logVariable возвращает после выполнения, что составляет undefined в случае успеха.

...