स्टेटमेंट, कैश मेमोरी में डेटा सेव करने की प्रोसेस को ब्लॉक करता है

कभी-कभी आपके ब्लॉक-कोड जनरेटर को कई बार अपने अंदरूनी ब्लॉक के कोड का रेफ़रंस देने की ज़रूरत होती है.

उदाहरण के लिए, अगर आपके पास ऐसा ब्लॉक है जो सूची के आखिरी एलिमेंट को प्रिंट करता है, तो आपको सूची कोड को कई बार ऐक्सेस करना होगा:

// Incorrect block-code generator.
javascriptGenerator.forBlock['print_last_element'] = function(block, generator) {
  const listCode = generator.valueToCode(block, 'LIST', Order.MEMBER);

  // listCode gets referenced twice.
  return `print(${listCode}[${listCode}.length - 1]);\n`;
}

हालांकि, अगर अंदरूनी ब्लॉक के कोड की वैल्यू अलग-अलग होती है या उसके खराब असर होते हैं, तो समस्या हो सकती है. उदाहरण के लिए, अगर अंदरूनी कोड असल में एक फ़ंक्शन कॉल है, तो यह कोड रेंज से बाहर हो सकता है:

print(randomList()[randomList().length - 1]);

अस्थायी वैरिएबल को असाइन करने से यह पक्का होता है कि अंदरूनी ब्लॉक के कोड का आकलन सिर्फ़ एक बार किया जाए.

अस्थायी वैरिएबल

अस्थायी वैरिएबल, एक अंदरूनी ब्लॉक की कोड स्ट्रिंग की वैल्यू को स्टोर करता है, ताकि कोड का सिर्फ़ एक बार आकलन किया जा सके. इसके बाद, उस वैल्यू का कई बार रेफ़रंस दिया जा सकता है.

import {javascriptGenerator, Order} from 'blockly/javascript';

// Correct block-code generator.
javascriptGenerator.forBlock['print_last_element'] = function(block, generator) {
  const listCode = generator.valueToCode(block, 'LIST', Order.MEMBER);
  const listVar = generator.nameDB_.getDistinctName(
      'temp_list', Blockly.names.NameType.VARIABLE);

  // listCode only gets evaluated once.
  const code = `var ${listVar} = ${listCode};\n`;
  return `print(${listVar}[${listVar}.length - 1]);\n`;
}

getDistinctName कॉल में आपकी पसंद का वैरिएबल नाम हो जाता है और वह नाम दिखाता है जो उपयोगकर्ता के तय किए गए वैरिएबल से मेल नहीं खाता.

ग़ैर-ज़रूरी कोड कम करें

अस्थायी वैरिएबल में एक समस्या यह है कि अगर इनर ब्लॉक का कोड कोई वैल्यू है, न कि फ़ंक्शन या एक्सप्रेशन, तो आपको एक ग़ैर-ज़रूरी कोड मिलता है:

// Assigning to temp_list is unnecessary.
var temp_list = foo;
print(temp_list[temp_list.length - 1]);

क्लीनर कोड बनाने के लिए यह देखें कि इनर ब्लॉक का कोड कोई वैल्यू है या नहीं. अगर ऐसा नहीं है, तो अस्थायी वैरिएबल को ही शामिल करें.

if (listCode.match(/^\w+$/)) {
  const code = `print(${listCode}[${listCode}.length - 1]);\n`;
} else {
  const listVar = generator.nameDB_.getDistinctName(
      'temp_list', Blockly.names.NameType.VARIABLE);
  const code = `var ${listVar} = ${listCode};\n`;
  code += `print(${listVar}[${listVar}.length - 1]);\n`;
}