1. a = 5
    2. var b = 2
    3. var gb = (function () {
    4. if (typeof self !== 'undefined') { return self; }
    5. if (typeof window !== 'undefined') { return window; }
    6. if (typeof global !== 'undefined') { return global; }
    7. throw new Error('unable to locate global object');
    8. }());
    9. console.log(gb.a, gb.b)

    《JavaScript权威指南(第6版)中文版》
    疑惑汇总
    1
    image.png
    笔者在chrome控制台测试 函数声明语句可以出现在循环、条件等语句中,

    1. (function() {
    2. // 模块代码
    3. } ())

    这种定义匿名函数并立即在单个表达式中调用它的写法非常常见,已经成为一种惯用法了。注意上面代码的圆括号的用法,function之 前的左圆括号是必需的,因为如果不写这个左圆括号,JavaScript解释器会试图将关键字function解析为函数声明语句。使用圆括号JavaScript解释器才会正确地将其解析为函数定义表达式。使用圆括号是习惯用法,尽管有些时候没有必要也不应当省略。这里定义的函数会立即调用。

    闭包与内存泄漏

    1. // 闭包与内存泄漏
    2. // 我们将作用域链描述为一个对象列表,不是绑定的栈。
    3. // 当函数返回的时候,就从作用域链中将这个绑定变量的对象删除。
    4. // 如果不存在嵌套的函数,也没有其他引用指向这个绑定对象,它就会被当做垃圾回收掉。
    5. function f1 () {
    6. var a = 1
    7. }
    8. f1() // a被垃圾回收掉
    9. // 但如果这些嵌套的函数对象在外部函数中保存下来,那么它们也会和所指向的变量绑定对象一样当做垃圾回收。
    10. function f2 () {
    11. var a = 1
    12. var b = function () {
    13. console.log('b', a)
    14. }
    15. b()
    16. }
    17. f2() // a, b 同时被垃圾回收掉
    18. // 但是如果这个函数定义了嵌套的函数,并将它作为返回值返回或者存储在某处的属性里,这时就会有一个外部引用指向这个嵌套的函数。
    19. // 它就不会被当做垃圾回收,并且它所指向的变量绑定对象也不会被当做垃圾回收
    20. function f2 () {
    21. var a = 1
    22. var b = function () {
    23. var c = 3
    24. console.log('b', a)
    25. }
    26. return b
    27. }
    28. var C = f2() // a不会被垃圾回收
    29. C() // c被垃圾回收 a,b 不会
    • 作者在这里清楚地解释了闭包和垃圾回收之间的关系,如果使用不慎,闭包很容易造成“循环引用”,当DOM对象和JavaScript对象之间存在循环引用时需要格外小心,在某些浏览器下会造成内存泄漏。

    isPrototypeOf 和 instanceOf 规则都一样,都会遍历原型链

    property :修改对象属性,不会体现到html结构中 p1.style.height = ‘100px’ 测试了一下体现在了html结构中了 ??
    attribute : 修改html属性,会改变html结构
    两者都有可能弓|起DOM重新渲染
    window.requestAnimationFrame 在后台会暂停

    1. function animate() {
    2. curWidth = curWidth + 3
    3. $div1.css('width', curWidth)
    4. if(curWidth > maxWidth) {
    5. return
    6. }
    7. return window.requestAnimationFrame(animate) // 尾调用优化
    8. }
    9. animate()