Я просто изучаю работу закрытия и начал играть с помощью некоторого кода. К моему пониманию, закрытие - это какая-то память, которая сохраняет среду функции в этом состоянии, когда было создано и оставлено замыкание (когда оно вернулось или привязано к событию), даже когда родительская функция закончилась.Закрытие Javascript и глобальные переменные
Так что я пробовал код ниже, который работает как ожидалось. Две кнопки, которые переключают свои соответствующие текстовые поля с «check» на «saved».
//var v1;
//var v2;
//var v3;
function func1(src, action, arg) {
document.getElementById(arg).value = "check";
document.getElementById(src.id).onclick = function() {
func2(src, action, arg);
};
//v1 = src;
//v2 = action;
//v3 = arg;
}
function func2(v1, v2, v3) {
document.getElementById(v3).value = "saved";
document.getElementById(v1.id).onclick = function() {
func1(v1, v2, v3);
};
}
<input type=text id="t1">
<input type=button id="btn1" value="Go 1" onclick="func1(this, 'edit', 't1')">
<input type=text id="t2">
<input type=button id="btn2" value="Go 2" onclick="func1(this, 'edit', 't2')">
Но теперь наступает замешательство. Когда я использую globals для построения замыкания в func2(), ошибка переключателей. Смотрите ниже код:
var v1;
var v2;
var v3;
function func1(src, action, arg) {
document.getElementById(arg).value = "check";
document.getElementById(src.id).onclick = function() {
func2();
};
v1 = src;
v2 = action;
v3 = arg;
}
function func2() {
document.getElementById(v3).value = "saved";
document.getElementById(v1.id).onclick = function() {
func1(v1, v2, v3);
};
}
<input type=text id="t1">
<input type=button id="btn1" value="Go 1" onclick="func1(this,'edit','t1')">
<input type=text id="t2">
<input type=button id="btn2" value="Go 2" onclick="func1(this,'edit','t2')">
Нажмите на Go1 -> Textbox1 = проверить; Нажмите Go2 -> Textbox2 = check; Но теперь нажмите Go1 -> Textbox2 (вместо 1) = сохранено.
Так что, кажется, что переменные v1, v2, v3 в замыкании по-прежнему используют глобальные значения вне замыкания. Может кто-нибудь объяснить, почему и что делать, это работает с глобалами?
Благодаря T.J.Crowder я обновил свой код, чтобы использовать закрытые переменные в закрытии. Но, к сожалению, это все еще не работает. Такое же поведение, как и второй блок кода.
var v1;
var v2;
var v3;
function func1(src, action, arg) {
document.getElementById(arg).value = "check";
document.getElementById(src.id).onclick = function() {
func2();
};
v1 = src;
v2 = action;
v3 = arg;
}
function func2() {
var private1 = v1;
var private2 = v2;
var private3 = v3;
document.getElementById(private3).value = "saved";
document.getElementById(private1.id).onclick = function() {
func1(private1, private2, private3);
};
}
<input type=text id="t1">
<input type=button id="btn1" value="Go 1" onclick="func1(this,'edit','t1')">
<input type=text id="t2">
<input type=button id="btn2" value="Go 2" onclick="func1(this,'edit','t2')">
* "... в func2() переключатели ошибка вокруг" * А? –
Второй блок кода должен вести себя так же, как это делает первый блок кода. Но это не так. – Smithy
Нет, не следует. Он должен вести себя так, как он себя ведет. –