diff --git a/packages/compiler-sfc/__tests__/compileScript.spec.ts b/packages/compiler-sfc/__tests__/compileScript.spec.ts
index 7afc1d5cabb..20ce70a97e8 100644
--- a/packages/compiler-sfc/__tests__/compileScript.spec.ts
+++ b/packages/compiler-sfc/__tests__/compileScript.spec.ts
@@ -1181,6 +1181,19 @@ const emit = defineEmits(['a', 'b'])
defineEmits([bar])
`)
).toThrow(`cannot reference locally declared variables`)
+
+ // #4644
+ expect(() =>
+ compile(`
+
+ `)
+ ).not.toThrow(`cannot reference locally declared variables`)
})
test('should allow defineProps/Emit() referencing scope var', () => {
diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts
index 08eb5588395..0dac40b2340 100644
--- a/packages/compiler-sfc/src/compileScript.ts
+++ b/packages/compiler-sfc/src/compileScript.ts
@@ -239,6 +239,7 @@ export function compileScript(
const helperImports: Set = new Set()
const userImports: Record = Object.create(null)
const userImportAlias: Record = Object.create(null)
+ const scriptBindings: Record = Object.create(null)
const setupBindings: Record = Object.create(null)
let defaultExport: Node | undefined
@@ -739,7 +740,7 @@ export function compileScript(
}
}
if (node.declaration) {
- walkDeclaration(node.declaration, setupBindings, userImportAlias)
+ walkDeclaration(node.declaration, scriptBindings, userImportAlias)
}
} else if (
(node.type === 'VariableDeclaration' ||
@@ -747,7 +748,7 @@ export function compileScript(
node.type === 'ClassDeclaration') &&
!node.declare
) {
- walkDeclaration(node, setupBindings, userImportAlias)
+ walkDeclaration(node, scriptBindings, userImportAlias)
}
}
@@ -1070,6 +1071,9 @@ export function compileScript(
? BindingTypes.SETUP_CONST
: BindingTypes.SETUP_MAYBE_REF
}
+ for (const key in scriptBindings) {
+ bindingMetadata[key] = scriptBindings[key]
+ }
for (const key in setupBindings) {
bindingMetadata[key] = setupBindings[key]
}
@@ -1198,8 +1202,11 @@ export function compileScript(
returned = `() => {}`
}
} else {
- // return bindings from setup
- const allBindings: Record = { ...setupBindings }
+ // return bindings from script and script setup
+ const allBindings: Record = {
+ ...scriptBindings,
+ ...setupBindings
+ }
for (const key in userImports) {
if (!userImports[key].isType && userImports[key].isUsedInTemplate) {
allBindings[key] = true