2016-04-20 3 views
1

У меня есть большое приложение JS со многими модулями, которое в конечном итоге будет в комплекте с browersify. Но поскольку я не хочу, чтобы вся моя команда устанавливала Node.js и перестраивалась каждый раз, когда они меняются Я хочу, чтобы модули регистрировались глобально только при разработке. Я использую стандартную регистрацию для модулей следующим образом:Смешная проблема с областью в Javascript с глобальными переменными

// if browserify 
if (typeof module === "object" && module.exports) { 
    module.exports = myModule; 
} else { window.myModule = myModule; } 

Вот где он получает фанк: Когда требует зависимостей в главном файле app.js, я делаю это:

if (typeof module === "object" && module.exports) { 
    var myModule = require("./js/myModule"); 
} // otherwise it's assumed to be globe, which console.log(window) confirms 
console.log(myModule); 

Эта консоль журнал возвращается как неопределенный, поэтому мне нужна строка else, которая говорит: } else { myModule = window.myModule; }

Вот простой jsFiddle как доказательство концепции:

if (false) { 
    var test = "Hello World"; 
} else { 
    window.test = "Hello Globe"; 
} 

document.getElementById("console").innerHTML = test; 

test не определено в этом сценарии.

Что меня задевает, так это то, что содержимое инструкции if, которая никогда не работает, по-прежнему регистрирует test в качестве локальной переменной. Это то, что происходит? Или я просто не понимаю, как работают глобальные переменные? Я думал, что все, что зарегистрировано до window, может быть вызвано его собственным именем, так как нам не нужно писать window.jQuery каждый раз.

+0

Вы пытаясь назначить переменные объекту window в узле? Потому что в узле нет оконного объекта. –

+0

Переменная, определенная с помощью var, является глобальными переменными в узле с файлом. Но проблема с этим вопросом решена в последнем узле. Узел вводит let test = 'Hello'; Тогда тест не будет доступен из стороны if. – bilalmetla

+0

Оператор *, который никогда не запускается, по-прежнему регистрирует тест как локальную переменную * "- уверен, что это так, вот как работают декларации. – Bergi

ответ

0

Javascript тали объявления Var и так как вы объявляете внутри, если заявление, что это не новая область, в основном имея это:

if (false) { 
    var test = "Hello World"; 
} else { 
    window.test = "Hello Globe"; 
} 

Это же иметь это:

var test; 
if (false) { 
    test = "Hello World"; 
} else { 
    window.test = "Hello Globe"; 
} 

Вот почему это хорошая практика, чтобы объявить ваши переменные в начале области, проверьте этот пример:

var test = "Hello World From outside"; 
function(){ 
    console.log(test); 
    if (false) { 
    var test = "Hello World From inside" 
    } 
} 

Этот пример выведет: «не определено» тест вар поднимается к верхней части рамки, в этом случае в верхней части функции перезаписи внешней переменной декларации, хотя мы никогда не будем входить в эту if

+1

«Это то же самое, что и эта» часть не совсем правильная. Это должно быть 'var test; if (false) {test = "Hello World"} 'Переменные объявления поднимаются, а не присваиваются. – noppa

+0

@noppa true, my bad –

+0

Ах! Googling «подъем» объясняет это - И я думал, что знаю свой JS. Благодаря! –

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