diff --git a/src/babel/transformation/helpers/call-delegate.js b/src/babel/transformation/helpers/call-delegate.js index bf306f5e9c..5313e8e27e 100644 --- a/src/babel/transformation/helpers/call-delegate.js +++ b/src/babel/transformation/helpers/call-delegate.js @@ -1,10 +1,33 @@ +import traverse from "../../traversal"; import * as t from "../../types"; -export default function (node) { - var container = t.functionExpression(null, [], node.body, node.generator, node.async); - container.shadow = true; +var visitor = { + enter(node, parent, scope, state) { + if (this.isThisExpression() || this.isReferencedIdentifier({ name: "arguments" })) { + state.found = true; + this.stop(); + } - var call = t.callExpression(container, []); + if (this.isFunction()) { + this.skip(); + } + } +}; + +export default function (node, scope) { + var container = t.functionExpression(null, [], node.body, node.generator, node.async); + + var callee = container; + var args = []; + + var state = { found: false }; + scope.traverse(node, visitor, state); + if (state.found) { + callee = t.memberExpression(container, t.identifier("apply")); + args = [t.thisExpression(), t.identifier("arguments")]; + } + + var call = t.callExpression(callee, args); if (node.generator) call = t.yieldExpression(call, true); return t.returnStatement(call); diff --git a/src/babel/transformation/transformers/es6/parameters.default.js b/src/babel/transformation/transformers/es6/parameters.default.js index 5286c322dc..5846e67a8e 100644 --- a/src/babel/transformation/transformers/es6/parameters.default.js +++ b/src/babel/transformation/transformers/es6/parameters.default.js @@ -92,7 +92,7 @@ exports.Function = function (node, parent, scope, file) { node.params = node.params.slice(0, lastNonDefaultParam); if (state.iife) { - body.push(callDelegate(node)); + body.push(callDelegate(node, scope)); node.body = t.blockStatement(body); } else { node.body.body = body.concat(node.body.body); diff --git a/test/core/fixtures/transformation/es6.parameters.default/iife-1128/exec.js b/test/core/fixtures/transformation/es6.parameters.default/iife-1128/exec.js new file mode 100644 index 0000000000..f9ec9718e4 --- /dev/null +++ b/test/core/fixtures/transformation/es6.parameters.default/iife-1128/exec.js @@ -0,0 +1,9 @@ +const bar = true; + +function foo(a = bar, ...b) { + const bar = false; + assert.equal(b[0], 2); + assert.equal(b[1], 3); +} + +foo(1, 2, 3);