2016-08-15 4 views
3

В следующем коде, почему я могу получить доступ к переменной x.b? Должна ли она иметь локальный охват?Область действия функции JavaScript

КОД

function x() { 
    var a = 3; 
} 


x.b = 8; 

console.log(x.a); 
console.log(x.b); 

ВЫВОД

undefined 
8 
+0

Я думаю, потому что функция - это объект, к которому вы можете получить доступ, и вы просто дали ему новое свойство «b». –

+1

Оба 'x' и' x.b' были определены в глобальной области. Итак, почему вы ожидаете, что у них будет «местный охват»? – str

+1

Существует, по-видимому, фундаментальное недоразумение. Точечная нотация не имеет доступа к локальным переменным. –

ответ

3

При использовании var объявить a внутри конструктора x «s, a является знак, как частный, однако, когда вы делаете x.b вы по существу говоря - добавить свойство b к объекту x.

Поэтому, когда вы делаете x.b, технически говоря, вы обращаетесь к объекту x свойство «s b, которая 8.

+0

Но 'x' здесь не является конструктором, и он не используется как один; это просто обычная старая функция. –

+0

@torazaburo правильный. 'x' - просто обычная старая функция. Я думал, что когда-то я видел ключевое слово 'new' где-то в последний раз ... Хм, я, должно быть, устал :( –

0

Вы определили x.b до 8, и она становится глобальной вар. Это означает, что вы можете получить доступ к нему из любого места.

Таким образом, x() - это функция, которая имеет свой собственный объем. Таким образом, вы не можете получить доступ к варам внутри области функций указанным способом. Однако вы можете получить доступ к «a», выполнив это и называя функцию x.

function x() { 
    var a = 3; 
    return a; 
} 
+1

' x.b' is ** not ** a "global var". Это свойство объекта, называемого 'x'. –

0

Javascript рассматривает x.b как глобальный объект. так что вы можете получить к нему доступ даже внутри функции:

x.b = 8; 
function x() { 
    var a = 3; 
    alert(x.b) 
} 
x(); 
console.log(x.a); 
console.log(x.b); 

Но не забудьте указать x.b перед объявлением функции.

тогда как объект a указан внутри функции x(), которая делает ее частной, поэтому вы получаете неопределенный результат для console.log (x.a);

если вы пишете так:

a = 5; 
function x() { 
    var a = 3; 
} 
x.b = 8; 

alert(a); 
alert(x.b); 

вы получите результаты, как показано ниже:

5 
8 

для Javascript а и x.a два отдельных объекта.

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