_.ইচ (তালিকা, পুনরাবৃত্তকারী, [প্রসঙ্গ]) এর প্রসঙ্গ কী?


উত্তর:


220

প্রসঙ্গের প্যারামিটারটি কেবল 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


7
এর সুবিধা কী? কেন শুধু someOtherArray[num]চেয়ে বরং উল্লেখ করুন this[num]?
csjacobs24

3
@ সিজাকোবস ২৪: পুনরায় ব্যবহারযোগ্য ফাংশনগুলির একটি সেট থাকতে পারে যা স্থানীয় ভেরিয়েবল স্কোপে অ্যাক্সেস না করে। এখানে একটি সাধারণ উদাহরণ: jsfiddle.net/a6Rx4/745

1
এই উত্তরটি প্রশ্নের উত্তর দেয়, তবে এটি কীভাবে এটি কার্যকর হতে পারে তার উদাহরণ প্রদান করা ভাল।
অস্থায়ী_ ব্যবহারকারী_নাম

50

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);

7

প্রসঙ্গটি আপনাকে কল-টাইমে আর্গুমেন্ট সরবরাহ করতে দেয়, জেনেরিক প্রাক-বিল্ট সাহায্যকারী ফাংশনগুলির সহজ কাস্টমাইজেশনের অনুমতি দেয়।

কিছু উদাহরণ:

// 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()পাস করার সময় দেশীয় সামঞ্জস্যতা প্রদানের জন্য সহায়কদের সাথে যুক্ত করি । অন্যথায়, তারা অবজেক্টগুলিতে বাধ্য হয়, যা সাধারণত এখনও কাজ করে তবে টাইপ-নির্দিষ্ট হওয়া আরও দ্রুত এবং সুরক্ষিত।


5

_.Ech এর সাধারণ ব্যবহার

_.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]প্যারামিটার হিসাবে পাস করতে পারেন এবং এটি প্রাথমিক অভিপ্রায় এবং আন্ডারস্কোর ডকুমেন্টেশনের শীর্ষে, তারা যা বলেছে ঠিক তেমন : পুনরুক্তি প্রাসঙ্গিক অবজেক্টের সাথে আবদ্ধ, যদি একটি পাস করা হয়


4

অন্যান্য উত্তরে 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.