Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
var y = 10;
потому что заменив её на y = 10;
мы получим желаемый результатfunction counter(i) {
inc = function() { alert(++i) };
dec = function() { alert(--i) };
}
counter(0);
inc(), inc(), dec();
var my_var = 'глобальная';
function my_function() {
var my_var = 'локальная';
var some_function = new Function('console.log(my_var)');
some_function();
}
my_function(); // 'глобальная'
это происходит потому что внутри функции z() мы уже не объявляем локальную переменную y, а ссылаемся на глобальную.
Этот пример затрагивает очень важный вопрос — вопрос неявного объявления переменных в JavaScript.
Есть только одно НО: если переменная не будет найдена ни в одном объекте в цепочке областей видимости, то интерпретатор JavaScript объявит используемую переменную автоматически и присвоит значение ей
После того, как вы осознаете все написанное в нем, вам откроется дверь к созданию мощных эффектов, которые обычно и называют замыканиями
Вместо выводов: Надеюсь описанный выше пример наглядно демонстрирует что такое лексическая область видимости и чем она отличается от динамической.
alert(foo) // ?
foo = function() {
return 1;
};
var foo = function() {
var i = 0;
foo = function() {
return i++;
}
return foo();
};
foo(); // ?
foo(); // ?
foo(); // ?
alert(foo) // ?
foo = function() {
return 1;
};
void function() {
'use strict';
alert(this); // ?
alert(eval('this')); // ?
alert((null, eval)('this')); // ?
alert(Function('return this')()) // ?
}();
foo = 1;
var bar = 1;
void function () {
alert(['foo' in this, 'bar' in this]); // [true, false];
}();
foo = 1;
var bar = 1;
delete foo; // true
delete bar; // false
alert(bar); // 1
alert(foo); // RefferenceError
'use strict';
global = 1;
alert(global) // ReferenceError
var test = 123;
var pd = Object.getOwnPropertyDescriptor(this, 'test');
pd.value = 321;
Object.defineProperty(this, 'test2', pd);
delete test;
delete test2;
console.log(test);
console.log(test2);
Но в частном случае глобального контектса — это тоже самое
alert(bar) // undefined
alert(foo) // Refference Error
var bar = 1;
foo = 1;
alert(bar) // undefined
alert(foo) // Refference Error
if (true) {
var bar = 1;
foo = 1;
}
var foo;
this.bar = void 0;
alert(bar);
alert(this.foo);
"use strict";
foo = 1;
var env = {};
with (env) {
foo = 1;
}
function runInContext(context, code) {
with (context) {
(function() {
eval.call(context, code);
}).call(context);
}
};
function runInStrictContext(context, code) {
(function() {
eval.call(context, code);
}).call(context);
};
Object.prototype.globalPropOrVar = 123;
alert(globalPropOrVar);
alert(({}).globalPropOrVar);
Лексическая область видимости функций в JavaScript