博客原文地址:Claiyre的我的博客 https://claiyre.github.io/
博客園地址:http://www.cnblogs.com/nuannuan7362/
如需轉載,請在文章開頭註明原文地址css
衆所周知,css是靜態語言,雖功能強大,但用起來仍是略微不爽,因而便有了動態樣式語言,sass和less。動態樣式語言的精髓就在於其有了變量,其中的諸多功能都是創建在變量之上的。所以,完全弄懂sass和less中變量的異同之處,是學好它們的關鍵!
本文由淺至深,逐步展開介紹,並從你們所熟知的JS變量的角度,講述sass和less變量做用域。html
sass和less都容許使用變量,且對變量的類型沒有限制,這一點和js極爲類似,很是靈活。但二者的不一樣都有哪些呢?git
sass中規定,以美圓符號 $
開頭的即表示變量,而less中以符號 @
開頭表示變量。這點很容易理解,再也不多說。github
在兩種語言中,變量均可以以必定的方式插入到字符串中去,這個特性極爲有用,但兩種語言的插入方式不一樣,具體請看下例:sass
//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,所以上面的代碼能夠正常運行。再來看下面這個:less
//代碼塊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
spa
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更大的靈活性,在學習使用的過程當中,必定要注意區分二者的不一樣,靈活運用。
參考:
以上僅我我的看法,若有錯誤之處,歡迎指正。如您以爲個人文章對您有幫助,請點擊下方「推薦」,讓更多的人看到。