টম হাটিনের মতে
ক্লোজার হ'ল কোডের একটি ব্লক যা এনকোলেসিং স্কোপের ভেরিয়েবলগুলিতে অ্যাক্সেস সহ রেফারেন্স করা যায় (এবং এর পাশ দিয়ে যায়) passed
এখন আমি জাভাস্ক্রিপ্ট বন্ধের উদাহরণটি উইকিপিডিয়ায় জাভাতে " স্ট্রেইথ " অনুবাদ সহ কার্যকর করার আশায় অনুকরণ করার চেষ্টা করছি :
//ECMAScript
var f, g;
function foo() {
var x = 0;
f = function() { return ++x; };
g = function() { return --x; };
x = 1;
print('inside foo, call to f(): ' + f()); // "2"
}
foo();
print('call to g(): ' + g()); // "1"
print('call to f(): ' + f()); // "2"
এখন জাভা অংশ: ফাংশন 1 হ'ল আরটি 1 (একটি যুক্তি) সহ "ফান্টেক্টর" ইন্টারফেস। ক্লোজার হ'ল ফাংশন 1 প্রয়োগকারী শ্রেণি, একটি কংক্রিট ফান্টেক্টর যা ফাংশন হিসাবে কাজ করে (int -> int)। মূল () পদ্ধতিতে আমি জাভাস্ক্রিপ্ট উদাহরণ থেকে কলগুলি প্রতিলিপি করে একটি ক্লোজার অবজেক্ট হিসাবে কেবলমাত্র ফু ফু ইনস্ট্যান্ট করি। ইন্টবক্স শ্রেণিটি কেবল একটি সাধারণ ধারক, এটি 1 ইনটের অ্যারের মতো আচরণ করে:
int a [1] = {0}
interface Function1 {
public final IntBag value = new IntBag();
public int apply();
}
class Closure implements Function1 {
private IntBag x = value;
Function1 f;
Function1 g;
@Override
public int apply() {
// print('inside foo, call to f(): ' + f()); // "2"
// inside apply, call to f.apply()
System.out.println("inside foo, call to f.apply(): " + f.apply());
return 0;
}
public Closure() {
f = new Function1() {
@Override
public int apply() {
x.add(1);
return x.get();
}
};
g = new Function1() {
@Override
public int apply() {
x.add(-1);
return x.get();
}
};
// x = 1;
x.set(1);
}
}
public class ClosureTest {
public static void main(String[] args) {
// foo()
Closure foo = new Closure();
foo.apply();
// print('call to g(): ' + g()); // "1"
System.out.println("call to foo.g.apply(): " + foo.g.apply());
// print('call to f(): ' + f()); // "2"
System.out.println("call to foo.f.apply(): " + foo.f.apply());
}
}
এটি প্রিন্ট করে:
inside foo, call to f.apply(): 2
call to foo.g.apply(): 1
call to foo.f.apply(): 2