細談sass和less中的變量及其作用域


博客原文地址:Claiyre的個人博客 https://claiyre.github.io/
博客園地址:http://www.cnblogs.com/nuannuan7362/
如需轉載,請在文章開頭注明原文地址

前言

眾所周知,css是靜態語言,雖功能強大,但用起來還是略微不爽,於是便有了動態樣式語言,sass和less。動態樣式語言的精髓就在於其有了變量,其中的諸多功能都是建立在變量之上的。因此,徹底弄懂sass和less中變量的異同之處,是學好它們的關鍵!
本文由淺至深,逐步展開介紹,並從大家所熟知的JS變量的角度,講述sass和less變量作用域。

正文

sass和less都允許使用變量,且對變量的類型沒有限制,這一點和js極為相似,非常靈活。但兩者的不同都有哪些呢?

變量標識符不同

sass中規定,以美元符號 $ 開頭的即表示變量,而less中以符號 @ 開頭表示變量。這點很容易理解,不再多說。

變量插值方式不同

在兩種語言中,變量都可以以一定的方式插入到字符串中去,這個特性極為有用,但兩種語言的插入方式不同,具體請看下例:

//sass 中

$direction: left;
.myPadding{
	padding-#{$direction}: 20px;                             
}

//less中

@direction: left;

.myPadding{
	padding-@{direction}: 20px;
}


//編譯后的css代碼是相同的,如下:

.myPadding{
	padding-left: 20px;
}

變量作用域

在sass 3.4.0之前,sass可以說是沒有局部變量和全局變量之分的,即后聲明的同名變量總是會覆蓋之前的同名變量,不管后聲明的變量是位於何處。
此時,less和sass的變量作用域有很大的不同之處。先看一段熟悉的js代碼:

//代碼塊A

var a = 1;
(function (){
	a = 5;
	alert(a);             //a = 5;
})();
alert(a);                 //a = 5;

由於閉包的作用,匿名函數內部可以引用到外部的變量a,因此上面的代碼可以正常運行。再來看下面這個:

//代碼塊B

var a = 1;
(function (){
	var a = 5;
	alert(a);             //a = 5;
})();
alert(a);                 //a = 1;

了解js鏈式作用域的朋友一定秒懂了上面的代碼。
在匿名函數的內部聲明了一個局部變量,局部變量並不會影響全部變量,所以代碼最后輸出的仍然是1。

那么回到正題,sass 3.4.0之前 的變量設計思想是類似於代碼塊A的,即不帶關鍵字var的局部變量聲明,而less的思想類似代碼塊B,帶關鍵字var的局部變量聲明。

看到這,很多人估計就想開始吐槽sass不人性化的設計了,萬一我一不小心聲明了一個局部變量,它和某個全局變量同名了,那不豈不是要釀成大禍!
大家先別急着吐槽,人家sass這不是也改進了嘛~ 而且sass不僅改了,還附送了彩蛋 !global

sass官網上 3.4.0版本的 Backwards Incompatibilities – Must Read! 中有這樣一條:

All variable assignments not at the top level of the document are now local by default. If there’s a global variable with the same name, it won’t be overwritten unless the !global flag is used. For example, $var: value !global will assign to $var globally. This behavior can be detected using feature-exists(global-variable-shadowing).

翻譯過來便是:沒有位於第一層(全局)的變量聲明現在都被默認為是局部的。如果存在一個同名的全局變量,這個全局變量也不會被重寫,除非同名的局部變量被聲明時使用關鍵字!default

舉例說明:

$color: blue;
a{
	$color: red;
	color: $color;         //red
}
p{
	color: $color;         //blue
}

//但是,若使用 !global

span{
	$color: yellow !global;
	color: $color;               //yellow
}
div{
	color: $color;               //yellow
}

上面的代碼沒有什么實際意義,但作為例子,簡潔明了便好。

有一點需要說明的是,sass 3.4.0 是在14年8月份發布的,但現在網上的關於sass變量的文章對作用域的說明,大多仍舊停留在3.4.0之前。希望大家能注意sass這個重要的改進,以免在開發過程中帶來不便。在此也得出一個血淚教訓,盡量看英文官方文檔啊啊啊啊

結語

sass和less兩種動態樣式語言的誕生,賦予了css更大的靈活性,在學習使用的過程中,一定要注意區分兩者的不同,靈活運用。

參考:

以上僅我個人見解,如有錯誤之處,歡迎指正。如您覺得我的文章對您有幫助,請點擊下方“推薦”,讓更多的人看到。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM