a = 5
var b = 2
var gb = (function () {
if (typeof self !== 'undefined') { return self; }
if (typeof window !== 'undefined') { return window; }
if (typeof global !== 'undefined') { return global; }
throw new Error('unable to locate global object');
}());
console.log(gb.a, gb.b)
《JavaScript权威指南(第6版)中文版》
疑惑汇总
1
笔者在chrome控制台测试 函数声明语句可以出现在循环、条件等语句中,
(function() {
// 模块代码
} ())
这种定义匿名函数并立即在单个表达式中调用它的写法非常常见,已经成为一种惯用法了。注意上面代码的圆括号的用法,function之 前的左圆括号是必需的,因为如果不写这个左圆括号,JavaScript解释器会试图将关键字function解析为函数声明语句。使用圆括号JavaScript解释器才会正确地将其解析为函数定义表达式。使用圆括号是习惯用法,尽管有些时候没有必要也不应当省略。这里定义的函数会立即调用。
闭包与内存泄漏
// 闭包与内存泄漏
// 我们将作用域链描述为一个对象列表,不是绑定的栈。
// 当函数返回的时候,就从作用域链中将这个绑定变量的对象删除。
// 如果不存在嵌套的函数,也没有其他引用指向这个绑定对象,它就会被当做垃圾回收掉。
function f1 () {
var a = 1
}
f1() // a被垃圾回收掉
// 但如果这些嵌套的函数对象在外部函数中保存下来,那么它们也会和所指向的变量绑定对象一样当做垃圾回收。
function f2 () {
var a = 1
var b = function () {
console.log('b', a)
}
b()
}
f2() // a, b 同时被垃圾回收掉
// 但是如果这个函数定义了嵌套的函数,并将它作为返回值返回或者存储在某处的属性里,这时就会有一个外部引用指向这个嵌套的函数。
// 它就不会被当做垃圾回收,并且它所指向的变量绑定对象也不会被当做垃圾回收
function f2 () {
var a = 1
var b = function () {
var c = 3
console.log('b', a)
}
return b
}
var C = f2() // a不会被垃圾回收
C() // c被垃圾回收 a,b 不会
- 作者在这里清楚地解释了闭包和垃圾回收之间的关系,如果使用不慎,闭包很容易造成“循环引用”,当DOM对象和JavaScript对象之间存在循环引用时需要格外小心,在某些浏览器下会造成内存泄漏。
isPrototypeOf 和 instanceOf 规则都一样,都会遍历原型链
property :修改对象属性,不会体现到html结构中 p1.style.height = ‘100px’ 测试了一下体现在了html结构中了 ??
attribute : 修改html属性,会改变html结构
两者都有可能弓|起DOM重新渲染
window.requestAnimationFrame 在后台会暂停
function animate() {
curWidth = curWidth + 3
$div1.css('width', curWidth)
if(curWidth > maxWidth) {
return
}
return window.requestAnimationFrame(animate) // 尾调用优化
}
animate()