UglifyJS icon indicating copy to clipboard operation
UglifyJS copied to clipboard

Declaring same variable inside `switch` causes outer one to drop

Open harai opened this issue 3 years ago • 0 comments

Declaring the same variable name inside switch causes the outer one to drop when uglified with unused=true option.

Uglify version (uglifyjs -V)

uglify-js 3.17.4

JavaScript input

(function() {
const value = 'x';
switch (value) {
  case 'x':
    const value = 'dummy';
    console.log('value is x.');
    break;
  default:
    console.log(`value is not x.`);
}
})();

The uglifyjs CLI command executed or minify() options used.

Disable most of features and set unused=true:

./uglifyjs sample.js --compress annotations=false,arguments=false,arrows=false,assignments=false,awaits=false,booleans=false,collapse_vars=false,comparisons=false,conditionals=false,dead_code=false,default_values=false,directives=false,evaluate=false,functions=false,hoist_exports=false,hoist_props=false,if_return=false,imports=false,inline=false,join_vars=false,loops=false,merge_vars=false,negate_iife=false,objects=false,properties=false,pure_getters=false,reduce_funcs=false,reduce_vars=false,rests=false,sequences=false,side_effects=false,spreads=false,strings=false,switches=false,templates=false,typeofs=false,unused=true,varify=false,yields=false --keep-fnames --keep-fargs -b --output sample.unused-true.min.js

JavaScript output or error produced.

$ cat sample.unused-true.min.js 
(function() {
    switch (value) {
      case "x":
        const value = "dummy";
        console.log("value is x.");
        break;

      default:
        console.log(`value is not x.`);
    }
})();

$ node sample.unused-true.min.js
/home/jharai/Sandbox/minifyjs/sample.unused-true.min.js:2
    switch (value) {
            ^

ReferenceError: value is not defined
    at /home/jharai/Sandbox/minifyjs/sample.unused-true.min.js:2:13
    at Object.<anonymous> (/home/jharai/Sandbox/minifyjs/sample.unused-true.min.js:11:3)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47

harai avatar Feb 12 '23 04:02 harai