> ## Documentation Index
> Fetch the complete documentation index at: https://docs.js-confuser.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Rename Variables

> Determines if variables should be renamed.

* Option name: `"renameVariables"`

* Option values: `true/false/Function`

***

### Input / Output

This example showcases how `Rename Variables` transforms the code. Try it out by changing the input code and see changes apply in real-time.

```js title="Input.js" lines interactive-mode="obfuscate" theme={null}
// Input.js
var twoSum = function (nums, target) {
  var hash = {};
  var len = nums.length;
  for (var i = 0; i < len; i++) {
    if (nums[i] in hash) return [hash[nums[i]], i];
    hash[target - nums[i]] = i;
  }
  return [-1, -1];
};

var test = function () {
  var inputNums = [2, 7, 11, 15];
  var inputTarget = 9;
  var expectedResult = [0, 1];

  var actualResult = twoSum(inputNums, inputTarget);
  ok(actualResult[0] === expectedResult[0]);
  ok(actualResult[1] === expectedResult[1]);
};

test();

// Output.js
var NuNuUw = function (NuNuUw, D9jnem) {
    var fOHfw1 = {},
      b6kIuF = NuNuUw.length;
    for (var RT0b4YA = 0; RT0b4YA < b6kIuF; RT0b4YA++) {
      if (NuNuUw[RT0b4YA] in fOHfw1) {
        return [fOHfw1[NuNuUw[RT0b4YA]], RT0b4YA];
      }
      fOHfw1[D9jnem - NuNuUw[RT0b4YA]] = RT0b4YA;
    }
    return [-1, -1];
  },
  D9jnem = function () {
    var D9jnem = [2, 7, 11, 15],
      m54g60p = 9,
      Qrjetu = [0, 1],
      F9DNLKi = NuNuUw(D9jnem, m54g60p);
    ok(F9DNLKi[0] === Qrjetu[0]);
    ok(F9DNLKi[1] === Qrjetu[1]);
  };
D9jnem();
```

***

#### Access the renamed variable

The comment syntax `/* @js-confuser-var */ "varName"` provides a method to access variable mappings. This is especially useful for `eval()` scenarios where you want preserve the mapping.

```js lines theme={null}
// Input
var message = "Hello world!";
eval(`console.log(${ /* @js-confuser-var */ "message"  })`);

console.log("message was renamed to", /* @js-confuser-var */ "message");

// Output
var nSgZyJf = "Hello world!";
eval(`console.log(nSgZyJf)`) // "Hello world!"
console["log"]("message was renamed to", "nSgZyJf") // message was renamed to nSgZyJf
```

Even if `Rename Variables` is disabled, the comment `/* @js-confuser-var */` will still be removed. (The original name will be returned as a string)

#### Never rename a variable

The prefix `__NO_JS_CONFUSER_RENAME__` disables renaming a certain variable. This can be useful for debugging the obfuscator.

```js lines theme={null}
// Input
var __NO_JS_CONFUSER_RENAME__message1 = "My first message"
var message2 = "My other message"

console.log(__NO_JS_CONFUSER_RENAME__message1)
console.log(message2)

// Output
var __NO_JS_CONFUSER_RENAME__message1 = "My first message";
var jRLf713 = "My other message";

console.log(__NO_JS_CONFUSER_RENAME__message1),
console.log(jRLf713)
```

***

### Custom Implementation

#### `options.renameVariables(varName)`

Control which variable names are changed. Returns a `boolean`.

| Parameter | Type     | Description                               |
| --------- | -------- | ----------------------------------------- |
| `varName` | `string` | The variable name proposed to be changed. |

```js title="Options.js" lines theme={null}
module.exports = {
  target: "node",

  // Disable renaming a certain variable
  renameVariables: (varName) => varName != "jQuery",
};
```

***

### Usage Example

The provided code example will obfuscate the file `input.js` and write the output to a file named `output.js`.

```js title="Usage Example" lines theme={null}
import JSConfuser from "js-confuser";
import {readFileSync, writeFileSync} from "fs";

// Read input code
const sourceCode = readFileSync("input.js", "utf8");
const options = {
  target: 'browser',
  renameVariables: true,
};

JSConfuser.obfuscate(sourceCode, options).then((result)=>{
  // Write output code
  writeFileSync("output.js", result.code);
}).catch(err=>{
  // Error occurred
  console.error(err);  
});
```

***

#### Enabled In

* [High Preset](/presets/high): Yes
* [Medium Preset](/presets/medium): Yes
* [Low Preset](/presets/low): Yes
