如何在Sass中分配全局变量?

mik*_*1aj 3 scope sass variable-assignment

我运行这个Sass代码:

$a: 1;
@if 2 + 2 == 4 {
    $a: 2;
}
@debug $a;
Run Code Online (Sandbox Code Playgroud)

我希望看到2.然而,输出是:

Line 5 DEBUG: 1
Run Code Online (Sandbox Code Playgroud)

我知道Sass $a@if范围内创建了一个新变量.如何更改此行为并为全局分配值$a

我使用Sass 3.4.0.

Gab*_*iel 9

当您使用Sass 3.4+时,您应该将!global标志附加到变量声明:

$a: 1;
@if 2 + 2 == 4 {
    $a: 2 !global;
}
@debug $a; // will output 2
Run Code Online (Sandbox Code Playgroud)

变量声明的原始SASS_REFERENCE声明:

"变量只能在定义它们的嵌套选择器级别内使用.如果它们在任何嵌套选择器之外定义,它们随处可用.

3.4+的SASS_CHANGELOG显示此行为已更改:

默认情况下,不在文档顶层的所有变量赋值都是本地的.如果存在具有相同名称的全局变量,则除非使用该!global标志,否则不会覆盖该变量.

例如,$var: value !global将分配给$var全局.可以使用以下方法检测此行为feature-exists(global-variable-shadowing).

  • FWIW,在我看来,这非常接近于一个真正的答案.特别是,它确实包含了解释需要使用`!global`的文档.在这方面,这是一个比被接受的答案更好的答案.剩下的就是这个答案的作者实际上提供了必要的语法.鉴于该语法已由另一个答案提供,期望在此处显示它似乎是多余的.最多,这个答案可以引用或以其他方式引用该方面的其他答案. (3认同)
  • @cimmanon这是答案的*补充*(也许我应该添加作为评论).这是'!global`使用的理由,'理性'的方式不是"试错". (2认同)

mik*_*1aj 7

通过反复试验,我找到了一个解决方案:我必须添加!global任务.

$a: 1;
@if 2 + 2 == 4 {
    $a: 2 !global;
}
@debug $a;
Run Code Online (Sandbox Code Playgroud)