2015-10-12 2 views
2

У меня есть this code in a fiddle:В JSFiddle, почему эта глобальная переменная не определена на `window`?

var a = 1; 

function b() { 
    var a = 10; 
    alert(window.a); 
} 

b(); 

Почему a не определено здесь? Он уже определен в глобальном пространстве имен, то есть window. (См. the fiddle для примера этого непредвиденного поведения.)

+0

Я имею в виду, если я напишу 1-й оператор без var, тогда a = 1, но с var a = undefined. –

+3

Я попробовал, и он предупредил '1'. – zvona

+0

работает и на меня –

ответ

2

Если вы используете этот код в скрипке, у которой нет местоположения, установленного на «Нет обертывания», или любых обстоятельствах, в которых вы не находитесь верхний уровень, внешний a: не глобальная переменная window.a. Рассмотрим простой пример, когда ваш код обернут внутри функции называется wrappingFunc:

// THIS would be the global `a`, outside `wrappingFunc` 
var a = "now the global a is defined"; 

function wrappingFunc() { 
    // this is NOT the global `a` 
    var a = 1; 

    function b() { 
     var a = 10; 
     alert(window.a); 
    } 

    b(); 
} 

wrappingFunc(); 

Это именно то, что делает JSFiddle когда вы устанавливаете местоположение в onLoad или onDomready. (См. What is the difference between onLoad, onDomready, No wrap - in <head>, and No wrap - in <body>?). Мой wrappingFunc пример в действительности onload или ondomready функция прослушивателя, которая предотвращает запуск в глобальном контексте.

+0

Да, я запускал этот код на jsfiddle. Я не знал, что jsfiddle обертывает код. –