先脑补两组场景。

场景一:

同事们每天中午都会外出吃饭。通常情况下都会先问,去哪儿吃啊?不知道啊?下楼再说吧。到了楼下好不容易有个人站出来说,既然没人说我可就说了啊,咱们去吃香草香草吧。没人反对就去,如果有人反对的话,我听大家的。嗯,此人非常在意别人的看法,懂得退让与妥协。
 
场景二:
部门A在楼下讨论去哪儿吃饭。按照惯例,是少数服从多数的原则,但是有个人非常的任性和强势,投什么票啊,烦不烦啊,我今天就想去吃大瓦罐!这会儿部门B过来了,他们原计划去吃麒麟雅苑的,这个人又跑到那边游说,麒麟雅苑有什么好啊,上菜又慢又难吃,天天吃不腻啊,跟我们去吃大瓦罐吧。于是,生拉硬拽之下,部门A和部门B都去了大瓦罐。此人非常强势,听不得别人的意见,他要别人都要服从于他的意见。
 
其实今天讨论的是sass里的变量作用域的问题。
最初的时候,大家是认为sass的作用域是很奇怪的甚至是不合理的:
http://www.qianduan.net/an-introduction-to-less-and-comparison-to-sass.html
http://www.cn-sass.com/译文/an-introduction-to-less-and-comparison-to-sass.html

虽然作者不同,分别是神飞和大漠,但内容都是翻译的同一篇文章:http://www.smashingmagazine.com/2011/09/09/an-introduction-to-less-and-comparison-to-sass/   时间是2011年。应该看出,sass意识到作用域这块儿的确有些奇葩,便在接下来的版本中做了改进,常规情况下,局部变量是无法覆盖全局变量的。
比方说:
----------------------------------------------------------------------
$color: red;
.test1{
    $color: blue;
    color: $color;
}
.test2{
    color: $color;
}
-----------------------------------------------------------------------
 
执行结果是:
.test1{
    color: blue;
}
.test2{
    color: red;
}
-----------------------------------------------------------------------
猜都猜的到。
如果是这种情况呢?
-----------------------------------------------------------------------
$color: red;
$color: yellow;
.test1{
    $color: blue;
    color: $color;
}
.test2{
    color: $color;
}
-------------------------------------------------------------------------
结果是:
.test1{
    color: blue;
}
.test2{
    color: yellow;
}
------------------------------------------------------------------------
red完全被yellow覆盖,这也很容易理解。
我们都知道,在CSS中,!important可以改变样式的权重优先级。其实sass中也有类似的参数,先说说老好人:!default。
还是后一种情况:
------------------------------------------------------------------------
$color: red;
$color: yellow!default;
.test1{
    $color: blue;
    color: $color;
}
.test2{
    color: $color;
}
-------------------------------------------------------------------------
大家猜一下结果。
不卖关子了,结果是:
.test1{
    color: blue;
}
.test2{
    color: red;
}
---------------------------------------------------------------------------
也就是说,yellow虽然在后面,却没有像上一次覆盖掉上一句的red!这是为什么呢?关键在于!default;它的作用在于降低变量的优先级,不至于因为排序的问题覆盖掉上一条的相同命名的变量。很像好好先生,不是吗?很善于做出妥协。
 
它的使用场景大多用在组件库中。因为组件库都是通用样式,实际业务中的样式的优先级肯定是高于组件样式的,所以为了防止在使用过程中组件排在业务之后而将其覆盖,而做出的妥协。或者用在协作开发中,如果自己很多地方拿不准或者需要以他人为准的情况。假如你定义了,使用你的,假如你没有定义,默认使用我的。很像是一个备胎。。。其实我们还可以叫得更学术一些,比方说:默认变量值。
 
万物都是相生相克的,一物降一物,有这样的参数,必然有人来站出来承担对立功能。
现在我们来说一下强硬派!global。
-------------------------------------------------------
$color: red;
.test1{
    $color: blue!global;
    color: $color;
}
.test2{
    color: $color;
}
----------------------------------------------------------
看到了吧。test1和test2都变成了color:blue。这说明!global影响了全局变量,进而影响到了其他选择器的局部变量。除非在test2里重置一下$color才可以抵消其影响。
 
我想像不出!global的使用场景,它很简单粗暴,完全破坏了作用域规则。实际项目中也没使用过。不到万不得已,慎用。

SASS系列之:!global VS !deafult的更多相关文章

  1. 前端测试框架Jest系列教程 -- Global Functions(全局函数)

    写在前面: Jest中定义了很多全局性的Function供我们使用,我们不必再去引用别的包来去实现类似的功能,下面将列举Jest中实现的全局函数. Jest Global Functions afte ...

  2. nopCommerce 3.9 大波浪系列 之 global.asax

    一.nop的global.asax文件 nop3.9基于ASP.NET MVC 5框架开发,而ASP.NET MVC中global.asax文件包含全局应用程序事件的事件处理程序,它响应应用程序级别和 ...

  3. 前端测试框架Jest系列教程 -- 简介

    写在前面: 随着互联网日新月异的发展,用户对于页面的美观度,流畅度以及各方面的体验有了更高的要求,我们的网页不再是简单的承载文字,图片等简单的信息传递给用户,我们需要的是更加美观的页面展示,更快的浏览 ...

  4. 前端测试框架Jest系列教程 -- Asynchronous(测试异步代码)

    写在前面: 在JavaScript代码中,异步运行是很常见的.当你有异步运行的代码时,Jest需要知道它测试的代码何时完成,然后才能继续进行另一个测试.Jest提供了几种方法来处理这个问题. 测试异步 ...

  5. 前端测试框架Jest系列教程 -- Matchers(匹配器)

    写在前面: 匹配器(Matchers)是Jest中非常重要的一个概念,它可以提供很多种方式来让你去验证你所测试的返回值,本文重点介绍几种常用的Matcher,其他的可以通过官网api文档查看. 常用的 ...

  6. 前端测试框架Jest系列教程 -- Mock Functions

    写在前面: 在写单元测试的时候有一个最重要的步骤就是Mock,我们通常会根据接口来Mock接口的实现,比如你要测试某个class中的某个方法,而这个方法又依赖了外部的一些接口的实现,从单元测试的角度来 ...

  7. 前端测试框架Jest系列教程 -- Expect(验证)

    写在前面 在编写测试时,我们通常需要检查值是否满足某些条件,Jest中提供的expect允许你访问很多“Matchers”,这些“匹配器”允许您验证不同的东西. Expect 可以验证什么 Jest中 ...

  8. 前端测试框架Jest系列教程 -- Mock Functions(模拟器)

    写在前面: 在写单元测试的时候有一个最重要的步骤就是Mock,我们通常会根据接口来Mock接口的实现,比如你要测试某个class中的某个方法,而这个方法又依赖了外部的一些接口的实现,从单元测试的角度来 ...

  9. 【Sass/SCSS】预加载器中的“轩辕剑”

    [Sass/SCSS]预加载器中的"轩辕剑" 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 随着前端 ...

随机推荐

  1. kube-promethues监控告警详解(邮件、钉钉、微信、自研平台)

    Alertmanager已经在前面Prometheus初体验(三)已经介绍过了.现在介绍一下在kube-promethues里面怎么修改alertmanager配置文件,以及怎么通过各种媒介发送信息. ...

  2. Java 自定义异常

    新建类CustomException继承 Exception /** * Create by on 2019-07-30 * 自定义类需要继承Exception * @author lsw */ pu ...

  3. python安装redis库

    pip install redis  没有相应的资源 可以到redisio上找到clients,  https://redis.io/clients 如下所示  下图中带黄五角星的为官方推荐的:  下 ...

  4. 接口测试中模拟post四种请求数据

    https://www.jianshu.com/p/3b6d7aa2043a 一.背景介绍 在日常的接口测试工作中,模拟接口请求通常有两种方法,fiddler模拟和HttpClient模拟. Fidd ...

  5. Android中Activity的启动模式(LaunchMode)和使用场景

    一.为什么需要启动模式在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中.当我们点击返回(back)键,这些Ac ...

  6. 003 Vue动画

    一: 0.说明 在进入/离开的过渡中,会有 6 个 class 切换. v-enter:定义进入过渡的开始状态.在元素被插入之前生效,在元素被插入之后的下一帧移除. v-enter-active:定义 ...

  7. 【转载】 【TensorFlow】static_rnn 和dynamic_rnn的区别

    原文地址: https://blog.csdn.net/qq_20135597/article/details/88980975 ----------------------------------- ...

  8. PLSQL查询执行计划

    转: PLSQL查询执行计划 01(转) 2019-05-15 15:15:43 p享自由q 阅读数 365   一般优化途径: 如果能通过修改语句优化,比如查询条件或执行顺序,sql改不了,可以通过 ...

  9. Spring cloud微服务安全实战-7-9自定义日志采集的格式和内容

    怎么来控制输出的日志的格式.并且从日志里面提取出来我想要的一些信息. 整个的message是一个大的json格式字符串. 虽然是可以通过关键字搜索到.但是日志看起来并不舒服. 在我们的控制台,日志实际 ...

  10. shell中跳出循环语句break和continue

    在使用while或for循环语句过程中,也许碰到某个特殊条件,我们需要跳过当次循环或整个循环,这是就需要借助break和continue. break表示跳出本层循环,break n表示跳出循环的层数 ...