Вы открываете функции или свойства замыкания, внутренне объявляя их в этой области (которая может изменяться в зависимости от вызова).
function example(val) {
var value = val;
this.getVal = function() {
return value;
}
this.setVal = function(v) {
value = v;
}
}
var ex = new example(2);
ex.getVal(); // == 2
ex.setVal(4); // == null
ex.getVal(); // == 4
Методы, объявленные в this может обращаться к переменным, объявленным с использованием var , но не наоборот '.
function example(val) {
var value = val;
var double = function(v) {
return 2 * v;
}
this.getDouble = function() {
return double(value);
}
}
var ex = new example(2);
ex.getDouble(); // == 4
Функция закрывает область действия.То, что вы хотите сделать, это вернуть ссылку на функцию, которая имеет доступ к требуемой области, чтобы вы могли вызвать ее на более позднем этапе.
Если вам нужно создать функцию, которая вызывает определенный метод внемного позже,
var ex = new example(2);
var delayed_call = function() {
return(ex.getDouble()); // == 4, when called
}
setTimeout(delayed_call, 1000);
Если проблема с областями видимости,
var ex = new example(2);
var delayed_call = (function(ex_ref) {
return function() {
return(ex_ref.getDouble()); // == 4, when called
}
})(ex); // create a new scope and capture a reference to ex as ex_ref
setTimeout(delayed_call, 1000);
Вы можете встроить большую часть этого в менее читаемый пример,
setTimeout((function(ex_ref) {
return function() {
return(ex_ref.getDouble()); // == 4, when called
})(new example(2)))
, 1000
);
setTimeout - это просто удобный способ демонстрации выполнения в новой области.
var ex = new example(2);
var delayed_call = function() {
return(ex.getDouble());
}
delayed_call(); // == 4