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 實際上是在函數被調用時發生的綁定,它指向什么完全取決于函數在哪里被調用。