2017.1.15开始读-2017.1.22完成
深入理解js知识点
书籍下载:http://download.csdn.net/detail/u010080803/9738410
第三章
3.4.3 let作用
`var foo = true;
if (foo) {
let bar = foo * 2;
bar = something( bar );
console.log( bar );//2
}
console.log( bar ); // ReferenceError
`
~~~
var foo = true;
if (foo) {
var bar = foo * 2;
bar = something( bar );
console.log( bar );//2
}
console.log( bar ); // 2
~~~
使用 let 进行的声明不会在块作用域中进行提升。声明的代码被运行之前,声明并不 “存在”。
~~~
console.log( bar ); // ReferenceError!
let bar = 2;
~~~
~~~
console.log( bar ); //2
var bar = 2;
~~~
第五章:闭包
~~~
闭包:
function foo() { var a = 2;
function bar() {
console.log( a );
}
return bar; }
var baz = foo();
baz(); // 2 —— 朋友,这就是闭包的效果。
~~~
函数 bar() 的词法作用域能够访问 foo() 的内部作用域。然后我们将 bar() 函数本身当作 一个值类型进行传递。在这个例子中,我们将 bar 所引用的函数对象本身当作返回值。
在 foo() 执行后,其返回值(也就是内部的 bar() 函数)赋值给变量 baz 并调用 baz(),实 际上只是通过不同的标识符引用调用了内部的函数 bar()。
bar() 显然可以被正常执行。但是在这个例子中,它在自己定义的词法作用域以外的地方 执行。
在 foo() 执行后,通常会期待 foo() 的整个内部作用域都被销毁,因为我们知道引擎有垃 圾回收器用来释放不再使用的内存空间。由于看上去 foo() 的内容不会再被使用,所以很 自然地会考虑对其进行回收。
而闭包的“神奇”之处正是可以阻止这件事情的发生。事实上内部作用域依然存在,因此 没有被回收。谁在使用这个内部作用域?原来是 bar() 本身在使用。
拜 bar() 所声明的位置所赐,它拥有涵盖 foo() 内部作用域的闭包,使得该作用域能够一 直存活,以供 bar() 在之后任何时间进行引用。
bar() 依然持有对该作用域的引用,而这个引用就叫作闭包。
~~~
function foo() {
var a = 2;
function baz() {
console.log( a ); // 2
}
bar( baz ); }
function bar(fn) {
fn(); // 妈妈快看呀,这就是闭包!
}
~~~
把内部函数 baz 传递给 bar,当调用这个内部函数时(现在叫作 fn),它涵盖的 foo() 内部 作用域的闭包就可以观察到了,因为它能够访问 a。
第二部分:this
this 既不指向函数自身也不指向函数的词法作用域.this 实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。