From bffa415b83e7cef21cb43b05cc05fc93cf0ac782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 13 Dec 2019 08:39:37 -0500 Subject: [PATCH] Check shadow variable to identifier in default parameters (#10053) When there is a variable declaration inside the function body, which shares its name to a referenced identifier in default parameter expression, the function body should be wrapped into iife, otherwise the binding in default parameter scope will be shadowed by function body. --- .../babel-plugin-transform-parameters/src/params.js | 6 +++++- .../fixtures/parameters/default-iife-9947/input.js | 6 ++++++ .../fixtures/parameters/default-iife-9947/output.js | 13 +++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/parameters/default-iife-9947/input.js create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/parameters/default-iife-9947/output.js diff --git a/packages/babel-plugin-transform-parameters/src/params.js b/packages/babel-plugin-transform-parameters/src/params.js index 000a8505a581..4bf346b5be7b 100644 --- a/packages/babel-plugin-transform-parameters/src/params.js +++ b/packages/babel-plugin-transform-parameters/src/params.js @@ -32,7 +32,11 @@ function isSafeBinding(scope, node) { const iifeVisitor = { ReferencedIdentifier(path, state) { const { scope, node } = path; - if (node.name === "eval" || !isSafeBinding(scope, node)) { + if ( + node.name === "eval" || + !isSafeBinding(scope, node) || + !isSafeBinding(state.scope, node) + ) { state.iife = true; path.stop(); } diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/default-iife-9947/input.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/default-iife-9947/input.js new file mode 100644 index 000000000000..e2ca36c7ddb2 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/default-iife-9947/input.js @@ -0,0 +1,6 @@ +let x = "outside"; +function outer(a = () => x) { + let x = "inside"; + return a(); +} +outer(); diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/default-iife-9947/output.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/default-iife-9947/output.js new file mode 100644 index 000000000000..74ff50c2df94 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/default-iife-9947/output.js @@ -0,0 +1,13 @@ +var x = "outside"; + +function outer() { + var a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () { + return x; + }; + return function () { + var x = "inside"; + return a(); + }(); +} + +outer();