2014-01-30 2 views
6

Я пытаюсь выяснить, как я могу получить переменные извне в функции, внутри функции в jQuery, но я получаю Uncaught ReferenceError: myvar is not defined. Есть ли способ сделать это?Как получить переменные извне, внутри функции в jQuery?

Простой пример моего кода:

$(function(){ 
    var myvar = "stackoverflow"; 
}); 

$(function(){ 
    alert(myvar); 
}); 

Но когда я определяю переменную вне функции она работает:

var myvar = "stackoverflow"; 

$(function(){ 
    alert(myvar); 
}); 

Почему?

Любая помощь приветствуется! Спасибо!

+1

Это так, как оно работает. прочитайте http: // stackoverflow.com/questions/500431/javascript-variable-scope – Sarath

+0

Да, читайте о области JS. – enguerranws

+0

Функции создают область. Переменные, объявленные с помощью 'var', являются * локальными * к этой функции и не могут быть доступны за ее пределами. Переменная существует только в момент, когда выполняется код (при отсутствии замыканий). –

ответ

8

Причина, по которой работает второй пример, заключается в том, что вы определяете myvar как глобальную переменную (доступную из любого места).

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

Как указано в комментариях, это именно то, как работает JavaScript. Если это проблема, с которой вы сталкиваетесь, то, вероятно, настало время переосмыслить вашу архитектуру.

Один общий шаблон для определения общих переменных как свойств родительских объектов или функций. Например:

$(function() { 
    var funcOne = function() { 
     this.sharedVal = 'stack overflow'; 
    }; 
    var funcTwo = function() { 
     console.log(funcOne.sharedVal); 
    }; 
}); 

Таким образом, вы можете иметь различные функции, которые способны делиться своими свойствами внутри другого в других функций, в то же время сохраняя глобальное пространство имен в чистоте. Обратите внимание, однако, что в этом примере простой var x = 'something';, который не связан как свойство другой функции, будет делать то же самое.

+0

Большое вам спасибо за хорошее объяснение. :) –

+0

Добро пожаловать: D – monners

3

Это связано с объемом переменной. Переменный, определенные в ($() функция имеет объем внутри этой функции. Enclusre здесь descide объема. Переменная определена вне функции имеет глобальную область видимости и определены в оконном объекте.

Области внутри функции.

$(function(){ 
    var myvar = "stackoverflow"; 
}); 
// myvar is not accessible here. 

Область внутри объекта окна.

$(function(){ 
    window.myvar = "stackoverflow"; 
}); 

// myvar is accessible here. 
6

его все о обзорного, в вашем втором примере MyVar в глобальной области, тогда как в первом его содержится в функции.

Вы можете заставить его быть глобальным, хотя:

$(function(){ 
    window.myvar = "stackoverflow"; 
}); 

$(function(){ 
    alert(myvar); 
}); 

(при условии, что это в браузере)

+1

Следует, наверное, отметить, что это «ужасная практика» ... Как мне известно, это единственный способ добиться того, что запросил ОП, поэтому +1. – monners

+0

:) Конечно, никогда не делайте этого, но его возможно –

1

Когда вы объявляете переменную внутри функции .Это имеет свой объем ограничивается только этой функции (в случае один из ваших сценариев).

Для доступа к ним повсюду вне функции вам необходимо объявить его глобальной переменной. Это второй случай.

Смежные вопросы