উত্তর:
প্রসঙ্গের প্যারামিটারটি কেবল this
পুনরুক্তি ফাংশনের মান নির্ধারণ করে ।
var someOtherArray = ["name","patrick","d","w"];
_.each([1, 2, 3], function(num) {
// In here, "this" refers to the same Array as "someOtherArray"
alert( this[num] ); // num is the value from the array being iterated
// so this[num] gets the item at the "num" index of
// someOtherArray.
}, someOtherArray);
কাজের উদাহরণ: http://jsfiddle.net/a6Rx4/
এটি সূচকটিতে আইটেমটি পেতে পুনরুক্তি করা অ্যারের প্রতিটি সদস্যের নম্বরটি ব্যবহার করে someOtherArray
, যা this
আমরা প্রাসঙ্গিক পরামিতি হিসাবে এটি পাস করার পরে থেকে প্রতিনিধিত্ব করা হয় ।
আপনি যদি প্রসঙ্গটি সেট না করেন তবে অবজেক্টটি this
উল্লেখ করবে window
।
context
যেখানে this
আপনার পুনরাবৃত্তির ক্রিয়াকে বোঝায়। উদাহরণ স্বরূপ:
var person = {};
person.friends = {
name1: true,
name2: false,
name3: true,
name4: true
};
_.each(['name4', 'name2'], function(name){
// this refers to the friends property of the person object
alert(this[name]);
}, person.friends);
প্রসঙ্গটি আপনাকে কল-টাইমে আর্গুমেন্ট সরবরাহ করতে দেয়, জেনেরিক প্রাক-বিল্ট সাহায্যকারী ফাংশনগুলির সহজ কাস্টমাইজেশনের অনুমতি দেয়।
কিছু উদাহরণ:
// stock footage:
function addTo(x){ "use strict"; return x + this; }
function pluck(x){ "use strict"; return x[this]; }
function lt(x){ "use strict"; return x < this; }
// production:
var r = [1,2,3,4,5,6,7,8,9];
var words = "a man a plan a canal panama".split(" ");
// filtering numbers:
_.filter(r, lt, 5); // elements less than 5
_.filter(r, lt, 3); // elements less than 3
// add 100 to the elements:
_.map(r, addTo, 100);
// encode eggy peggy:
_.map(words, addTo, "egg").join(" ");
// get length of words:
_.map(words, pluck, "length");
// find words starting with "e" or sooner:
_.filter(words, lt, "e");
// find all words with 3 or more chars:
_.filter(words, pluck, 2);
এমনকি সীমিত উদাহরণগুলি থেকেও আপনি দেখতে পাচ্ছেন যে পুনরায় ব্যবহারযোগ্য কোড তৈরির জন্য "অতিরিক্ত যুক্তি" কতটা শক্তিশালী হতে পারে। প্রতিটি পরিস্থিতির জন্য আলাদা কলব্যাক ফাংশন করার পরিবর্তে আপনি সাধারণত নিম্ন-স্তরের সহায়ককে অভিযোজিত করতে পারেন। লক্ষ্যটি হ'ল ন্যূনতম বয়লারপ্লেট সহ আপনার কাস্টম যুক্তিকে একটি ক্রিয়া এবং দুটি বিশেষ্য বান্ডিল করা।
স্বীকার করা হয়, তীর ফাংশন জেনেরিক বিশুদ্ধ ফাংশনগুলির অনেকগুলি "কোড গল্ফ" সুবিধাকে সরিয়ে দিয়েছে, তবে শব্দার্থবিজ্ঞান এবং ধারাবাহিকতার সুবিধাগুলি রয়ে গেছে।
আমি সবসময় "use strict"
আদিমদের [].map()
পাস করার সময় দেশীয় সামঞ্জস্যতা প্রদানের জন্য সহায়কদের সাথে যুক্ত করি । অন্যথায়, তারা অবজেক্টগুলিতে বাধ্য হয়, যা সাধারণত এখনও কাজ করে তবে টাইপ-নির্দিষ্ট হওয়া আরও দ্রুত এবং সুরক্ষিত।
_.each(['Hello', 'World!'], function(word){
console.log(word);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
এখানে ব্যবহার করতে পারে এমন সাধারণ উদাহরণ_.each
:
function basket() {
this.items = [];
this.addItem = function(item) {
this.items.push(item);
};
this.show = function() {
console.log('items: ', this.items);
}
}
var x = new basket();
x.addItem('banana');
x.addItem('apple');
x.addItem('kiwi');
x.show();
আউটপুট:
items: [ 'banana', 'apple', 'kiwi' ]
addItem
একাধিকবার কল করার পরিবর্তে আপনি এভাবে আন্ডারস্কোর ব্যবহার করতে পারেন :
_.each(['banana', 'apple', 'kiwi'], function(item) { x.addItem(item); });
যা addItem
এই আইটেমগুলির সাথে ধারাবাহিকভাবে তিনবার কল করার অনুরূপ । মূলত এটি আপনার অ্যারের পুনরুক্তি করে এবং প্রতিটি আইটেমের জন্য আপনার বেনামে কলব্যাক ফাংশন কল করে x.addItem(item)
। বেনামে কলব্যাক ফাংশন addItem
সদস্য ফাংশনের অনুরূপ (যেমন এটি কোনও আইটেম নেয়) এবং অর্থহীন kind সুতরাং, বেনামি কার্যক্রমে যাওয়ার পরিবর্তে ভাল যে _.each
এই দিকনির্দেশকে এড়িয়ে চলে এবং addItem
সরাসরি কল করে:
_.each(['banana', 'apple', 'kiwi'], x.addItem);
তবে এটি কাজ করবে না, যেমন ঝুড়ির addItem
সদস্য ফাংশনটি this
আপনার তৈরি x
ঝুড়িকে বোঝায় না । এজন্য আপনার ঘুড়িটি x
ব্যবহার করার জন্য আপনার পাস করার বিকল্প রয়েছে [context]
:
_.each(['banana', 'apple', 'kiwi'], x.addItem, x);
function basket() {
this.items = [];
this.addItem = function(item) {
this.items.push(item);
};
this.show = function() {
console.log('items: ', this.items);
}
}
var x = new basket();
_.each(['banana', 'apple', 'kiwi'], x.addItem, x);
x.show();
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
সংক্ষেপে, যদি আপনি কলব্যাক ফাংশনটি পাস করেন যা কোনওভাবে _.each
ব্যবহার করে this
তবে this
আপনার কলব্যাক ফাংশনের অভ্যন্তরে কী উল্লেখ করা উচিত তা আপনাকে নির্দিষ্ট করতে হবে। এটা মনে হতে পারে মত x
আমার উদাহরণে অপ্রয়োজনীয়, কিন্তু x.addItem
মাত্র একটি ফাংশন এবং সম্পূর্ণ সম্পর্কহীন হতে পারে x
বা basket
বা অন্য কোন বস্তু, উদাহরণস্বরূপ :
function basket() {
this.items = [];
this.show = function() {
console.log('items: ', this.items);
}
}
function addItem(item) {
this.items.push(item);
};
var x = new basket();
_.each(['banana', 'apple', 'kiwi'], addItem, x);
x.show();
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
অন্য কথায়, আপনি this
আপনার কলব্যাকের অভ্যন্তরে কিছু মান বেঁধে রাখেন বা আপনি পাশাপাশি সরাসরি বাঁধাই ব্যবহার করতে পারেন :
_.each(['banana', 'apple', 'kiwi'], addItem.bind(x));
কিছু ভিন্ন আন্ডারস্কোর পদ্ধতিতে এই বৈশিষ্ট্যটি কীভাবে কার্যকর হতে পারে?
সাধারণভাবে, যদি কোনও underscorejs
পদ্ধতি একটি কলব্যাক ফাংশন গ্রহণ করে এবং আপনি যদি সেই কলব্যাকটি কোনও অবজেক্টের কোনও সদস্য ফাংশনে (যেমন একটি ফাংশন যা ব্যবহার করে this
) কল করতে চান তবে আপনি সেই ফাংশনটিকে কোনও বস্তুর সাথে আবদ্ধ করতে পারেন বা সেই বস্তুকে [context]
প্যারামিটার হিসাবে পাস করতে পারেন এবং এটি প্রাথমিক অভিপ্রায় এবং আন্ডারস্কোর ডকুমেন্টেশনের শীর্ষে, তারা যা বলেছে ঠিক তেমন : পুনরুক্তি প্রাসঙ্গিক অবজেক্টের সাথে আবদ্ধ, যদি একটি পাস করা হয়
অন্যান্য উত্তরে context
যেমন বর্ণনা করা হয়েছে, this
কলব্যাকের অভ্যন্তরে কী প্রসঙ্গটি ব্যবহার করা হবে তা পেরিয়ে গেছে each
।
আমি আন্ডারস্কোর উত্স কোড থেকে প্রাসঙ্গিক পদ্ধতির উত্স কোডের সহায়তায় এটি ব্যাখ্যা করব
এর সংজ্ঞা _.each
বা _.forEach
নিম্নরূপ:
_.each = _.forEach = function(obj, iteratee, context) {
iteratee = optimizeCb(iteratee, context);
var i, length;
if (isArrayLike(obj)) {
for (i = 0, length = obj.length; i < length; i++) {
iteratee(obj[i], i, obj);
}
} else {
var keys = _.keys(obj);
for (i = 0, length = keys.length; i < length; i++) {
iteratee(obj[keys[i]], keys[i], obj);
}
}
return obj;
};
দ্বিতীয় বিবৃতি এখানে লক্ষ করা গুরুত্বপূর্ণ
iteratee = optimizeCb(iteratee, context);
এখানে, context
অন্য পদ্ধতিতে পাস করা হয় optimizeCb
এবং এটি থেকে ফিরে ফাংশনটি পরে নির্ধারিত হয় iteratee
যা পরে বলা হয়।
var optimizeCb = function(func, context, argCount) {
if (context === void 0) return func;
switch (argCount == null ? 3 : argCount) {
case 1:
return function(value) {
return func.call(context, value);
};
case 2:
return function(value, other) {
return func.call(context, value, other);
};
case 3:
return function(value, index, collection) {
return func.call(context, value, index, collection);
};
case 4:
return function(accumulator, value, index, collection) {
return func.call(context, accumulator, value, index, collection);
};
}
return function() {
return func.apply(context, arguments);
};
};
উপরোক্ত পদ্ধতির সংজ্ঞা থেকে দেখা যায় optimizeCb
, যদি context
পাস না হয় তবে func
যেমন হয় তেমন ফেরত দেওয়া হয়। যদি context
পাস হয়ে যায়, কলব্যাক ফাংশন হিসাবে ডাকা হয়
func.call(context, other_parameters);
^^^^^^^
func
বলা হয় call()
যার সাথে এর this
প্রসঙ্গ সেট করে কোনও পদ্ধতির ডাক দিতে ব্যবহৃত হয় । সুতরাং, যখন this
ভিতরে ব্যবহার করা হয় func
, এটি উল্লেখ করবে context
।
// Without `context`
_.each([1], function() {
console.log(this instanceof Window);
});
// With `context` as `arr`
var arr = [1, 2, 3];
_.each([1], function() {
console.log(this);
}, arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
আপনি জাভাস্ক্রিপ্টে context
সর্বশেষ alচ্ছিক পরামিতি হিসাবে বিবেচনা করতে পারেন forEach
।
someOtherArray[num]
চেয়ে বরং উল্লেখ করুনthis[num]
?