2015-01-15 4 views
0

Если функции являются объектами в javascript, почему я не могу получить доступ к области видимости определенной области?Почему я не могу получить доступ к переменным внутри функции?

Я понимаю, что в коде:

// variable test assigned an anonymous function 
var test = function(){ 
    var x = 5; 
}; 
console.log(test.x); // undefined 

// Even when the function is explicitly named: 
function test(){ 
    var x = 5; 
} 
console.log(test.x); // undefined 

мне не нужно, чтобы получить эту работу или что-нибудь; Мне просто нужно понять, почему функции такие.

Спасибо.

+0

В созданные вами переменные видны в области видимости функции. И да, они являются объектами, поэтому вы можете сделать «var test = function() {}; test.x = 5; ' – andrusieczko

+2

Локальные переменные не магически становятся свойствами объекта функции. И ни в коем случае переменная 'x' даже не существует в вашем приложении, потому что' test' никогда не выполняется. –

+0

Вероятно, вы имели в виду 'var test = function() {this.x = 5; console.log (х);}; test.x = 3; контрольная работа(); console.log (test.x); '; поэтому здесь, когда вы пишете 'this.x = 5', а затем вы вызываете функцию типа' test() ', она вызывается с областью« окна ». Так эффективно, 'this.x = 5' в теле функции эквивалентно' window.x = 5'. Теперь console.log (x) в этом случае пытается найти локальную переменную 'x', а затем глобальную переменную' x'. Итак, 'console.log (x)' здесь совпадает с 'console.log (window.x)'. Итак, вы получили 'test.x === 3' и' window.x === 5'. – andrusieczko

ответ

0

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

Это эквивалент частных членов в классе объектно-ориентированного языка.

В качестве альтернативы вы могли бы

function test() { 
 
    this.x = 5; 
 
} 
 

 
var testInstance = new test(); 
 

 
console.log(test.x);

+0

Да, мне было интересно, почему это не было ясно видно, не присваивая его другой переменной. Но я думаю, что ты прав. Я полностью забыл о сфере действия. Теперь это имеет смысл. – sevenbus

0

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

Вы можете присвоить свойство функции объекта, как это:

var test = function() {}; 
test.x = 5 
+0

А это действительно имеет смысл. Я ошибочно предположил, что объявления переменных в функции принадлежат самому себе. Я должен был рассматривать это как утверждения, которые создаются в пределах области функции при вызове. Благодаря! – sevenbus

0

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

0

Вы создали локальные переменные. Локальная переменная может быть доступна только внутри функции.

Постарайтесь понять о локальных переменных & Global JavaScript

Локальные переменные JavaScript

Переменные, объявленные внутри функции JavaScript, становятся локальными по отношению к функции.

Локальные переменные имеют локальную область видимости: к ним могут быть доступны только функции.

function myFunction() { 

    var name = "roy"; 

    // code here can use name 

} 

Глобальный JavaScript Переменные

переменной, объявленной вне функции, становится глобальным.

Глобальная переменная имеет глобальную область действия: все сценарии и функции на веб-странице могут получить к ней доступ.

var name = "roy"; 

// code here can use name 

function myFunction() { 

    // code here can use name 

} 
1

Это будет один из способов сделать то, что вы пытаетесь:

function test() { 
    this.x = 5; 
} 

var foo = new test(); 
console.log(foo.x); 

Использование var x, а не this.x просто объявляет локальную переменную

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