javascript 闭包与模块

闭包 closure :

Observational: closure is a function instance remembering its outer variables even as that function is passed around and invoked in other scopes.

<pre>
    <a href="">Visit the Apress website</a>
    <p>I like <span>apples</span> and oranges.</p>
    <a class="myclass1 myclass2" href="">Visit the W3C website</a>
</pre>

var pre = document.getElementsByTagName("pre")[0].children;
add_the_handlers(pre);
// error 
var add_the_handlers = function (nodes) {
    var i;
    console.log(nodes.length);
    for (i = 0; i < nodes.length; i += 1) {
        nodes[i].onclick = function (e) {
            alert(i);
        };
    }
};
nodes 节点可以绑定到 [0-1-2下标],但是 alert 执行时实际是对闭包环境变量的链接引用,此时 i 已经变成了3,因此最后点击时的 i 总会显示为3.
// ok
var add_the_handlers = function (nodes) {
    var helper = function (i) {
        return function (e) {
            alert(i);
        };
    };
    var i;
    for (i = 0; i < nodes.length; i += 1) {
        nodes[i].onclick = helper(i);
    };
}
helper 创建了一个闭包,通过形参记录了每一个 i,同时 onclick 保持对该函数的引用,保持该词法环境一直存在。
onclick 触发时,每个执行函数都有自己对应的词法环境,每个环境里都有自己的 i 值。
// 更简单写法
var add_the_handlers = function (nodes) {
    console.log(nodes.length);
    for (let i = 0; i < nodes.length; i += 1) {
        nodes[i].onclick = function (e) {
            alert(i);
        };
    }
};
每次循环都会创建新的 i

模块,模块模式。利用函数作用域和闭包创建被绑定对象与私有成员的关联。

举例:

var serial_maker = function () {
    var prefix = '';
    var seq = 0;
    return {
        set_prefix: function (p) {
            prefix = String(p);
        },
        set_seq: function (s) {
            seq = s;
        },
        gensym: function () {
            var result = prefix + seq;
            seq += 1;
            return result;
        }
    }
}

var serialm = serial_maker()
serialm.set_prefix("qqqq")
serialm.set_seq(10000)
serialm.gensym()
->qqqq1000

prometheus 监控探索

Prometheus 组件使用

blackbox_exporter

  • 配置可以使用的协议模块 用于获取监控的设备的信息。 默认端口9115
  • 通过 restful 请求获取信息,配置文件里可配置支持各种协议。

alertmanager

  • 配置警报信息,配置上下游相关信息。默认端口9093

举例:配置企业微信的报警通知时,新建部门,应用要配置对应可见部门,否则会报错。参数 to_user 可@all。

prometheus server

  • 主服务用于加载各个服务组件,配置监控规则,监控任务目标。默认端口9090

重新加载配置: POST http://localhost:9090/-/reload

使用

  • 先后启动组件 alert、blackbox、prometheus,浏览 ~:9090/metrics 可查看指标。

web-frontend base

html:

some tips:

  • data-: 用户自定义属性
  • base 元素 http-equiv 属性,例如 <meta http-equiv=“refresh” content=“5;http://…”> 是指 5sec 后重新载入指定 url
  • target 属性, 新页面跳转显示方式 [_self, _blank]
  • 删除元素 <s></s>

css:

样式应用总结:

  • 1看层叠次序
  • 2看selector-specificity分数,酌情考虑 !import
  • 3看定义次序
  • 4看继承关系,酌情考虑 inherit
  • css中绝对单位:

  • css中相对单位:

  • 布局相关:

    • float: 浮动[left, right, none],clear:阻止浮动元素堆叠[left, right, both, none]。
    • positioning: 定位元素内容[static, relative, absolute, fixed]
    • display:元素盒类型
      — inline ,元素占据行内的一段内容
      — block,元素占据一行
      — inline-block, 同inline 一样,不同是垂直方向上会有空行
      — box model:padding, margin, border;box-sizing: 尺寸应用到元素盒子哪一部分。
      — 布局:colume 多列布局;flex 弹性盒;table表格

js:

  • === 和 == 等同和相等,看类型与值。
    基本类型只是看值,对象类型看应用【类型】
    基本类型相等测试会类型转换

  • null和undefine,空值和未定义。

  • hasOwnProperty ,排除原型属性。

  • 原型

    • Object.create 构造一个已经存在的对象的新实例。
    • Object.prototype 所有通过对象字面量创建的对象会连接
    • Function.prototype 函数对象会隐藏连接到这上面。
  • 扩充类型的功能,通过原型
    内部 this 被绑定为实际上级对象。

  • 闭包: 内部函数会应用外部函数的上下文环境。