diff --git a/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts b/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts
index c92814089ef..f57b4c26fed 100644
--- a/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts
+++ b/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts
@@ -613,6 +613,7 @@ describe('compiler: expression transform', () => {
props: BindingTypes.PROPS,
setup: BindingTypes.SETUP_MAYBE_REF,
setupConst: BindingTypes.SETUP_CONST,
+ setupLet: BindingTypes.SETUP_LET,
data: BindingTypes.DATA,
options: BindingTypes.OPTIONS,
reactive: BindingTypes.SETUP_REACTIVE_CONST,
@@ -658,6 +659,16 @@ describe('compiler: expression transform', () => {
expect(code).toMatchSnapshot()
})
+ // #6822
+ test('no access this through function declaration', () => {
+ const { code } = compileWithBindingMetadata(
+ `
`,
+ )
+ expect(code).toMatch(`$setup.setupConst.bind()`)
+ expect(code).toMatch(`$setup.setupLet.bind()`)
+ expect(code).toMatch(`$setup.setup.bind()`)
+ })
+
test('literal const handling', () => {
const { code } = compileWithBindingMetadata(`{{ literal }}
`, {
inline: true,
diff --git a/packages/compiler-core/__tests__/transforms/vOn.spec.ts b/packages/compiler-core/__tests__/transforms/vOn.spec.ts
index 9fda0259585..e7e662b516d 100644
--- a/packages/compiler-core/__tests__/transforms/vOn.spec.ts
+++ b/packages/compiler-core/__tests__/transforms/vOn.spec.ts
@@ -1,4 +1,5 @@
import {
+ BindingTypes,
type CompilerOptions,
type ElementNode,
ErrorCodes,
@@ -760,5 +761,30 @@ describe('compiler: transform v-on', () => {
},
})
})
+
+ test('variable function handler ', () => {
+ const { node } = parseWithVOn(``, {
+ prefixIdentifiers: true,
+ cacheHandlers: true,
+ bindingMetadata: {
+ foo: BindingTypes.SETUP_LET,
+ },
+ })
+ const vnodeCall = node.codegenNode as VNodeCall
+ expect(
+ (vnodeCall.props as ObjectExpression).properties[0].value,
+ ).toMatchObject({
+ type: NodeTypes.JS_CACHE_EXPRESSION,
+ index: 0,
+ value: {
+ type: NodeTypes.COMPOUND_EXPRESSION,
+ children: [
+ `(...args) => (`,
+ { content: `$setup.foo && $setup.foo.call(undefined, ...args)` },
+ `)`,
+ ],
+ },
+ })
+ })
})
})
diff --git a/packages/compiler-core/src/transforms/transformExpression.ts b/packages/compiler-core/src/transforms/transformExpression.ts
index ec2d4685314..8a90b64ba30 100644
--- a/packages/compiler-core/src/transforms/transformExpression.ts
+++ b/packages/compiler-core/src/transforms/transformExpression.ts
@@ -212,7 +212,10 @@ export function processExpression(
type === BindingTypes.LITERAL_CONST
) {
// setup bindings in non-inline mode
- return `$setup.${raw}`
+ // #6822 No access `this` through function declaration in