2013-04-25 5 views
5
var foo = '1', 
    bar = '2'; 

console.log(foo, bar, window.foo); //1, 2, undefined 

(function(foo){ 
    console.log(foo, bar); //2, 2 
})(bar); 

У меня есть две тривиальные вопросы относительно приведенного выше кода:функции прицелы и глобальные переменные

  1. Почему window.foo не определено? Не все глобальные переменные привязаны к объекту окна по умолчанию?

  2. Почему foo === 2 внутри крышки? Я знаю, что я передаю оригинал bar с псевдонимом foo, который является 2, но за пределами области действия foo по-прежнему 1. И, насколько я знаю, исходный foo может быть доступен изнутри крышки. Является ли «новый foo» приоритетным, поскольку он передан в качестве аргумента для IIFE?

http://jsfiddle.net/GbeDX/

+1

Вопрос 1 - посмотрите, как запускается скрипка - 'onLoad'. Вопрос 2 - вы правы. Параметр 'foo'« перезаписывает »внешнюю область« foo », но ** только ** внутри IIFE. Я думаю, что это называется затенением. Таким образом, вы больше не сможете ссылаться на внешний 'foo', если вы не измените имя параметра ... или если' foo' фактически задано как свойство 'window' – Ian

ответ

9

Почему window.foo не определено? Не все ли «глобальные» переменные автоматически привязаны к объекту окна?

Да, глобальные переменные становятся свойствами window, но код не запускается в глобальном масштабе в вашей скрипке. Он запускается в обработчике событий load (см. Второй флажок слева, он говорит «onLoad»). Здесь он работает в глобальном масштабе: http://jsfiddle.net/GbeDX/1/

Почему foo === 2 внутри крышки? [...] И, насколько я знаю, исходный foo может быть доступен изнутри закрывающего устройства.

Нет, не может. Параметр fooshadows переменная foo. Если это глобальная переменная, вы можете получить доступ к ней с помощью window.foo.

+0

Спасибо, что я искал. – Johan

1
  1. Да. Я думаю, вы выполнить этот код в некоторой отладке среды, как Firebug, jsFiddle и т.д., которые неявно оборачивает этот код в сферу

  2. Вы передаете значение 2 в эту прямоприменяемой анонимную функцию, и вы получите доступ значение через локальный аргумент foo. Поскольку поиск цепочки всегда работает bottom-> up, разрешение для этого имени переменной останавливается в локальной области, где foo находится в качестве аргумента.

1
  1. window.foo === '1', если только вы не запустили это внутри другой функции.
  2. foo === '2' внутри крышки, потому что вы объявили foo в качестве входного аргумента функции. Вы можете получить доступ к глобальным областям foo, если вы не решили объявить локальную область с тем же именем.
0
  1. Да. Возможно, вы видите переменную foo в undefined, потому что вы используете свой сценарий в отладочный среде как поджигатель или jsfiddle (связанный https://stackoverflow.com/a/11572991/975520)
  2. No. Параметр foo перезаписать переменную foo. Но это глобальная переменная, поэтому вы можете использовать ее как window.foo.
Смежные вопросы