2015-06-10 2 views
2

Я сделал несколько тестов с кодами перечислены ниже:JavaScript параметр функции и сфера

function foo(x) { 
    alert(y); 
} 
var y = 'I am defined outside foo definition'; 
foo(); 

Приведенный выше код дает мне предупреждение «Я определен вне определения Foo».

Затем еще одно испытание:

function bar(x) { 
    alert(x); 
} 
var x = 'I am defined outside foo definition'; 
bar(); 

function bar(x) { 
    alert(x); 
} 
x = 'I am defined outside bar definition'; 
bar(); 

Обе вышеуказанные коды дают мне предупреждение 'неопределенные'.

Итак, почему?

+0

Что вы хотите сказать? –

+0

Мой вопрос: почему –

ответ

1

Это происходит потому, что при объявлении параметра х

function bar(x) {...} 

Вы «скрываются» глобальная переменная х. У вас есть доступ только к параметру х

попробовать переходящий в глобальном х

function bar(x) {alert(x);} 
var x = 'I am defined outside bar definition'; 
bar(x); // here the x is the global x that we pass in 
     // the function gets a reference to the global x 

Если параметр опущен, то глобальные х станет видимым

function baz() {alert(x); } 
var x = 'global var'; 
baz(); // 'global var' 

Обратите внимание, что глобальные переменные должны быть ограничено в хороших js-приложениях.

3

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

В этом случае вам нужно передать значение параметру при bar вызове

function bar(x) {alert(x);} 
x = 'I am defined outside foo definition'; 
bar(x); 

В первом случае, когда вы используете y внутри bar нет локальной области видимости переменного называется y в bar так это смотрит на родительскую область, чтобы увидеть, существует ли такая переменная, если так, чтобы доступ к переменным был таким, как это работает

2

Если вы определили:

var y = 'I am defined outside foo definition'; 

Это будет глобальная переменная окно (в случае, если вы используете JS в браузере), которые могут быть доступны «глобально» по телефону:

window.y 

Если вы используете его внутри функции, как :

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

Если определить функцию:

function foo(y) {alert(y);} 

Тогда y в настоящее время омрачен параметром функции (что кстати псевдоним arguments[0]).Это означает, что все ссылки на переменную y внутри этой функции будут ссылаться на переменную параметра, а не на глобальную. Так, например:

var y = 'I am defined outside foo definition'; 
function foo(y) { y = 'something';} 
alert(y); 

покажет Я определен вне определения Foo.

Edit: Если у вас есть функция:

function bar(x) { 
    alert(x); 
} 

и вы пытаетесь вызвать его с помощью bar() затем параметрической функции параметра x тени глобальной переменной x. Двигатель JS будет искать локальную переменную x, и она не будет найдена - это означает, что вы получите сообщение undefined в своем уведомлении.