İfade, bağımsız değişkenleri önbelleğe almayı engeller

Bazen blok kodu oluşturma aracınızın, iç bloğunun koduna birkaç kez referans vermesi gerekir.

Örneğin, bir listenin son öğesini yazdıran bir blokunuz varsa liste koduna birden çok kez erişmeniz gerekir:

// 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`;
}

Ancak bu, iç bloğun kodunun ortaya çıkan değeri tutarsızsa veya yan etkileri varsa sorunlara yol açabilir. Örneğin, iç kod aslında bir işlev çağrısıysa bu özel kod, aralık dışında bir koşulla sonuçlanabilir:

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

Geçici değişkenlere atama yapmak, iç blokun kodunun yalnızca bir kez değerlendirilmesini sağlar.

Geçici değişkenler

Geçici değişken, bir iç bloğun kod dizesinin değerini depolar. Böylece, kod yalnızca bir kez değerlendirilir ve daha sonra, değere birden çok kez referans verilebilir.

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 çağrısı, istediğiniz değişken adını alır ve kullanıcı tanımlı herhangi bir değişkenle çakışmayan bir ad döndürür.

Gereksiz kodu azaltın

Geçici değişkenlerin olumsuz tarafı, iç bloğun kodu bir işlev veya ifade değil de bir değerse gereksiz olan bir kod elde etmenizdir:

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

Daha açık bir kod üretmek için iç bloğun kodunun değer olup olmadığını kontrol edebilir ve geçici değişkeni yalnızca değer değilse ekleyin.

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`;
}