You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何.d2中的$var编译为4而非3?SCSS变量作用域疑问

问题原因:Sass的变量提升与作用域规则

你遇到的问题是Sass的变量提升特性,加上默认作用域规则共同导致的:

  • Sass编译时,会把同一代码块(比如.d大括号包裹的区域)内的所有变量声明,提前到块的顶部解析,完全无视代码书写顺序。
  • 在.d块里,你先声明了$var: 3,但.d1里的$var: 4没加!local标记,这个赋值会被当成对.d作用域内$var的重新覆盖,而非.d1专属的局部变量。
  • 等编译到.d2时,.d作用域内的$var已经被改成4,所以输出结果就是4。

不同在线编译器输出不同,是因为它们用了不同版本的Sass(比如旧版Ruby Sass和新版Dart Sass逻辑有差异),或是开启了不同编译模式。

解决方法

要让.d1的变量不影响父作用域的$var,给.d1内的变量加上!local关键字,明确它是局部作用域变量即可:

$var: 0;

.a {
    $var: 1;
    z-index: $var; // 1
}

.b {
    z-index: $var; // 0
}

.c {
    .c1 {
        $var: 2;
        z-index: $var; // 2
    }

    .c2 {
        z-index: $var; // 0
    }
}

.d {
    $var: 3;

    .d1 {
        $var: 4 !local; // 显式声明为局部变量
        z-index: $var; // 4
    }

    .d2 {
        z-index: $var; // 3,符合预期
    }
}

编译后.d2的z-index就会是3,.d1的变量只会在自身作用域生效,不会污染父作用域的$var。另外,你也可以直接给子作用域变量起不同名字避免冲突,但用!local是更规范的做法。

内容的提问来源于stack exchange,提问作者bitcorisa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:47:50