先脑补两组场景。

场景一:

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

    在某些业务场景下,我们需要自定义弹出层关闭事件,代码示例如下: layui.use('layer', function () { var layer = layui.layer; layer.open ...

  2. 刷题记录:[SUCTF 2019]CheckIn

    目录 刷题记录:[SUCTF 2019]CheckIn 一.涉及知识点 1.利用.user.ini上传\隐藏后门 2.绕过exif_imagetype()的奇技淫巧 二.解题方法 刷题记录:[SUCT ...

  3. 作业——11 分布式并行计算MapReduce

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3319 1.用自己的话阐明Hadoop平台上HDFS和MapRedu ...

  4. Dolly

    dolly - 必应词典 美['dɑli]英['dɒli] n.洋娃娃:(搬运重物的)台车 v.用独轮车运(物):用搅拌棒洗(衣):用捣棒捣碎(矿石) 网络多莉:多利:移动式摄影小车 变形复数:dol ...

  5. python练习:寒冰猴子狐狸,猫狗咬架

    python练习:寒冰猴子狐狸,猫狗咬架 一,寒冰猴子狐狸 class Person: def __init__(self, na, gen, age, fig): self.name = na se ...

  6. Flutter Dart List.map() 获取下标

    class HomePageState extends State{ final topTitles = ['审批单', '机票列表', '客服']; final topIcons = ['asset ...

  7. 位运算在 PHP 实际项目当中的高级运用

    我们首先来看一个系统中常见的需求: 有一个广告表,我们要对广告做显示控制: 手动上下线. 只允许 VIP 查看. 可能的表结构如下: CREATE TABLE `finger_ad` ( `ad_id ...

  8. nginx启动命令以及与配置systemctl

    一.配置systemctl之前的启动方式 进入sbin目录下执行以下命令: 启动nginx的命令为 /usr/local/nginx/sbin/nginx 3 停止nginx的命令为 /usr/loc ...

  9. Jenkins - 以Docker方式安装启动Jenkins

    1 - 官网信息 操作步骤:https://jenkins.io/zh/doc/book/installing/#docker Docker映像地址:https://hub.docker.com/r/ ...

  10. mysql类型转换函数convert与cast的用法

    原文地址:https://blog.csdn.net/kouwoo/article/details/45535733 简单介绍下mysql数据库中用于类型转换的二个函数,convert与cast函数, ...