让前端飞

Javascript细节总结1

2019-01-02  本文已影响6人  littleyu

1.javascript无动态作用域链

栗子如下:

var a = 1;
function s() {
    var a = 3;
    x();
}
function x() {
    console.log(a);
}
s(); //a = 1

词法作用域让foo()中的a通过RHS引用到了全局作用域中的a,因此会输出2;而动态作用域并不关心函数和作用域是如何声明以及在何处声明的,只关心它们从何处调用。换句话说,作用域是基于调用栈的,而不是代码中的作用域嵌套;JAVASCRIPT不具有动态作用域(但this机制在某种程度上很像动态作用域的)。

2.this指向问题

栗子如下:

function a() {
    function c() {
        return this;
     }
     return c();
}
var o = new a();

此时上面的this指向是全局对象还是对象o?;

3.重绘(Repaint)和回流(Reflow)

重绘和回流是渲染步骤中的一小节,但是这两个步骤对于性能影响很大。

回流必定会发生重绘,重绘不一定会引发回流。回流所需的成本比重绘高的多,改变深层次的节点很可能导致父节点的一系列回流。

所以以下几个动作可能会导致性能问题:

减少重绘和回流

<div class="test"></div>
<style>
    .test {
        position: absolute;
        top: 10px;
        width: 100px;
        height: 100px;
        background: red;
    }
</style>
<script>
    setTimeout(() => {
        // 引起回流
        document.querySelector('.test').style.top = '100px'
    }, 1000)
</script>
for(let i = 0; i < 1000; i++) {
    // 获取 offsetTop 会导致回流,因为需要去获取正确的值
    console.log(document.querySelector('.test').style.offsetTop)
}
上一篇 下一篇

猜你喜欢

热点阅读