Закрытие очень похоже на объект. Он создается при каждом вызове функции.
Объем закрытия в JavaScript лексический, что означает, что все, что содержится в функции, к которой принадлежит замыкание , имеет доступ к любому переменная, которая в ней.
Переменная содержится в закрытии , если вы
var foo=1;
или var foo;
Если внутренняя функция (функция, содержащаяся внутри другой функции) обращается к такой переменной, не определяя ее в своей собственной области с помощью var, она изменяет содержимое переменная во внешнем замыкании .
Закрытие переживает время выполнения функции, которая породила его. Если другие функции выходят из закрытия / scope , в котором они определены (например, как возвращаемые значения), они будут продолжать ссылаться на это закрытие .
function example(closure) {
// define somevariable to live in the closure of example
var somevariable = 'unchanged';
return {
change_to: function(value) {
somevariable = value;
},
log: function(value) {
console.log('somevariable of closure %s is: %s',
closure, somevariable);
}
}
}
closure_one = example('one');
closure_two = example('two');
closure_one.log();
closure_two.log();
closure_one.change_to('some new value');
closure_one.log();
closure_two.log();
somevariable of closure one is: unchanged
somevariable of closure two is: unchanged
somevariable of closure one is: some new value
somevariable of closure two is: unchanged
Чтобы найти ближайший маяк, вы можете попробовать что-то вроде этого:
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region){
String closestBeacon = null;
for (Beacon beacon : beacons) {
if (closestBeacon == null)
closestBeacon = beacon;
else {
if (closestBeacon.getDistance() > beacon.getDistance()) {
closestBeacon = beacon;
}
}
}
Log.i(TAG, closestBeacon.getBluetoothAddress() + " beacon is the closest to you");
}