先脑补两组场景。

场景一:

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

    通道提供了一种被称为Scatter/Gather的重要新功能(有时也被称为矢量I/O).Scatter/Gather是一个简单却强大的概念,它是指在多个缓冲区上实现一个简单的I/O操作.对于一个wri ...

  2. activiti 自定义用户

    https://blog.csdn.net/meng564764406/article/details/53789958 此文目的: 对网络上的关于对activiti 使用做一个总结,因为很难找到一个 ...

  3. 不使用BASE64Encoder、BASE64Decoder

    BASE64Encoder/BASE64Decoder类在sun.misc包下,是sun公司的内部方法,后期有删除的潜在可能,建议使用apache commons.codec下的Base64替代. m ...

  4. matlab学习笔记10 一般运算符

    一起来学matlab-matlab学习笔记10 10_1一般运算符 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...

  5. Python - Django - jQuery 实现简单的 AJAX

    AJAX 局部刷新实例: 使用 jQuery 实现基本的发送 AJAX 请求 index.html: <!DOCTYPE html> <html lang="en" ...

  6. ADB命令使用大法

    ​前言 Android开发调试工具ADB的使用.ADB(Android Debug Bridge)是Android SDK中的一个工具, 使用ADB可以直接操作管理Android模拟器或者真实的And ...

  7. 浏览器中开发人员工具快速找到dom元素绑定那些JS事件

    在web开发过程中难免会遇到让程序员去修改一些js代码东西,例如js的ajax和php等语言的交互等,在这其中你不得不了解点js的事件触发,且随着js的盛行各种插件的事件让程序员眼花缭乱,所以借助一个 ...

  8. python类型检测最终指南--Typing模块的使用

    正文共:30429 字 预计阅读时间:76分钟 原文链接:https://realpython.com/python-type-checking/ 作者:Geir Arne Hjelle 译者:陈祥安 ...

  9. CodeForces-1152C-Neko does Maths

    C. Neko does Maths time limit per test:1 second memory limit per test:256 megabytes input:standard i ...

  10. python函数知识五 推导式和内置函数一(了解)

    17.推导式: 推导式:将for循环多行变成一行 list推导式:[] #普通模式 print([i for i in range(20)]) #循环模式 #[变量 for i in range(20 ...