Начнем с того, в JavaScript var
распространяется до функция, которая появляется в, не блок, что в Таким образом, если есть блок в функции (например, если заявление) любой var
, определенном внутри, если заявление будет область видимости функции:.
function foo() {
if (1 === 1) {
var output = "Something";
}
console.log(output);
}
foo();
Когда вы находитесь внутри with
блока, вы определяете «контекст» для работы. Таким образом, в вашем случае вы работаете с местоположением. При ссылке на переменную, она будет сначала искать переменную в контексте location
, если он не может найти его, он будет смотреть на область видимости функции:
function foo() {
var notInLocation = "something "; // Not as attribute of location
var pathname = "something else"; // Is as attribute of location
// the pathname in the location here seems to be "/js"
with (location) {
console.log(notInLocation + href); // href is a attribute of location and notInLocation isn't
console.log(pathname + href); // hred and pathname are both attributes in location
}
}
foo()
Таким образом, в ваш блок with
, он сначала попробует location.qs
и не найдет атрибут с именем qs
, поэтому он рассмотрит область функций и подберет переменную, которую вы определили ранее.
Переменная, объявленная с помощью 'var' внутри' with'-block, добавляется к ее окружению ('buildUrl'). 'with' действует подобно глобальному объекту' window', за исключением этого. Btw, 'with' устарел в Javascript. Посмотрите на это [сообщение в блоге] (http://www.2ality.com/2011/06/with-statement.html) – ftor