block、Element、Modifier的缩写,中文意思是块、元素、修饰。在某种程度上,BEM和OOP是相似的。它是一种用代码和一系列模式来描述现实情况的方法,它只考虑程序实体而无所谓使用什么编程语言
.block { /* styles */ }
.block__element { /* styles */ }
.block--modifier { /* styles */ }
在规范中,块表示一个组件的意思,这样看上去有点抽象,我们可以通过例子来学习,假设你要写一个按钮的组件。我们只需要设置了一个 .button 类的按钮,然后可以在任何<button>
按钮上使用该类,就可以生成该组件的传统样式。使用.button而不是用button的原因是因为类允许无限的可重用性,而即使是最基本的元素也可能改变样式。但是在实际的项目使用中,我们会发现一个按钮可能是大按钮,可能是小按钮,也可能是红色的,或者黄色的。于是就引申出了BEM的modifier
修饰符是改变某个块的外观的标志。要使用修饰符,可以将 --modifier
添加到块中。假如我们要添加一个默认按钮,一个主要按钮,一个大按钮,一个小按钮,一个主要的小按钮。我们可以这样
<button class=".button .button--default"></button>
<button class=".button .button--primary"></button>
<button class=".button .button--large"></button>
<button class=".button .button--small"></button>
<button class=".button .button--primary .button--small"></button>
元素是块的子节点。为了表明某个东西是一个元素,你需要在块名后添加 __element
。所以,如果你看到一个像那样的名字,比如 form__row
,你将立即知道 .form
块中有一个 row
元素。
<form class="form" action="">
<div class="form__row">
</div>
</form>
<style>
.form__row { /* styles */ }
</style>
优点:
Instantly Invoked Function Expression 即时调用函数表达式
;(function () {
// ... statements
return ...
)()
//最好在 IIFE 前追加分号 ; 来避免解析时与前一个表达式合并出现问题
好处:
创建一个局部作用域隔离变量;但在 ES6 拥有了块级作用域后变得没有必要,可以用语句块 { ... }
配合 let
/const
替代
将运行逻辑转化为可求值的表达式,弥补 JavaScript 基本逻辑语句不是表达式的缺陷
const a = (() => {
if (...) return 1
else return 0
})()
let a
if (...) a = 1
else a = 0
节约变量
// 还有更多节约变量的方式
var getInfo = (function() {
var info = null;
return function(callback) {
if (info) callback();
ajax(api, function(res){
info = res.data; callback();
});
}
})();
原文:https://www.cnblogs.com/EricZLin/p/13334155.html