先脑补两组场景。

场景一:

同事们每天中午都会外出吃饭。通常情况下都会先问,去哪儿吃啊?不知道啊?下楼再说吧。到了楼下好不容易有个人站出来说,既然没人说我可就说了啊,咱们去吃香草香草吧。没人反对就去,如果有人反对的话,我听大家的。嗯,此人非常在意别人的看法,懂得退让与妥协。
 
场景二:
部门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. 公司不用 Spring Boot,果断离职了!

    面试问到离职原因,我想这是很多面试者的痛,包括我自己,曾经也被离职原因所坑过. 面试回答离职原因简直特么就是巨坑,我也因此在微信公众号 "Java技术栈" 写了这篇文章<过了 ...

  2. 作业——10 分布式文件系统HDFS 练习

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3292 利用Shell命令与HDFS进行交互 以”./bin/dfs ...

  3. MongoDB笔记: 常见问题

    系统配置 设置ulimit MongoDB的文件机制 每个Collection会单独创建一个数据文件(collection-xxxxxx.wt) 每个索引会单独创建一个文件(index-xxxxxx. ...

  4. nodejs接收前端formData数据

    转:https://www.cnblogs.com/zhensg123/p/11078579.html 很多时候需要利用formdata数据格式进行前后端交互. 前端代码可以是如下所示: <!D ...

  5. [转]CSS3 使用 calc() 计算高度 vh px

    1.px 像素,我们在网页布局中一般都是用px. 2.百分比 百分比一般宽泛的讲是相对于父元素,自适应网页布局越来越多,百分比也经常用到了. 3.Viewport    viewport:可视窗口,也 ...

  6. odoo开发笔记 -- 异常处理in resolve_deps field = model

    场景描述: 更新代码,重启服务服务后,odoo后台报错,提示关键字:in resolve_deps field = model._fields[fname]  KeyError: 'entry_id' ...

  7. Oracle系列十一 数据处理

    数据操纵语言 DML(Data Manipulation Language – 数据操纵语言) 可以在下列条件下执行: 向表中插入数据 修改现存数据 删除现存数据 事务是由完成若干项工作的DML语句组 ...

  8. layui自定义模块

    想把用了layui的页面的一些函数抽取公用,直接引入外部js不可行,只能用layui的模块功能.官网没有说明,但模块名必须和文件名一致 新建yananmod.js文件,内容如下: layui.defi ...

  9. [LeetCode] 245. Shortest Word Distance III 最短单词距离 III

    This is a follow up of Shortest Word Distance. The only difference is now word1 could be the same as ...

  10. 【Sqoop学习之二】Sqoop使用

    环境 sqoop-1.4.6 一.基本命令1.帮助命令 [root@node101 ~]# sqoop help Warning: /usr/local/sqoop-/../hbase does no ...