從來沒寫過博客,一來是因為我這個人文筆太差了,寫些短東西還行,寫的長了文思就枯竭不知道該怎么繼續往下寫了,而是平時研究的問題都比較零散,真不知道該怎么在博客里記錄下來。一般都是記在筆記本里,習慣了手寫的感覺。\(^o^)/~
今天群里討論一個關於js的問題,截圖如下:
驗證的結果在圖中都有顯示,群里有個哥們說是自動加上private修飾符的關系,感覺說的不怎么對。所以又研究了下,順便把相關知識點在鞏固一下。
其實上面的問題牽涉到的事javascript的作用域鏈的東西,網上有很多關於作用域鏈的文章,在這里又不浪費時間了。首先說一個技巧吧,在作用域鏈中,有[[scope]],scope chain,還有活動對象等一大堆東西,想理解這些東西還要在畫個圖出來才能讓人理解明白,感覺太抽象了。有一個比較直觀的方法可以直觀的查看作用域。在chrome中,F12把調試工具調出來,設置一個斷點,先進入調試狀態再說。上圖啦:
F11走着,進入函數內部以后右側會顯示相應的一些東西,關於叫什么東西俺也不是特別清楚。還是上圖說話比較直觀。先上圖再說:
看到了吧,就中間那個Scope Variable,就是scope里的變量啦!看到下面的有Local、Closure還有Global。看起來有沒有感覺呀?跟作用域鏈是不是很像呀!如果繼續F11調試的話,跳到另外的函數內部,相應的變量也就發生了變化。可以通過Scope Variable來查看作用域的相關信息。
現在還是來看看最上面提到的這個JS問題。在Foo()這個函數里定義了暫且說是三個函數吧。_pc()、bar()和bar2(),先來看看_pc(),這個是一個閉包,引用了外部函數的變量a,只能在定義它的Foo()這個函數里來調用,所以外部調用是會報錯的。第二個bar()函數是一個定義式的函數,而且變量bar沒有var修飾,所以成為一個全局變量的函數,直接調用bar()或者window.bar();在bar()函數的作用域中this指向window,而非Foo。第三個就是定義在Foo()里的變量bar2()了,它的作用域也稱為局部變量作用域。所以可以通過obj.bar2();來調用。其實只要細心從函數的變量作用域和作用域鏈來分析,一切都會很明朗的。
寫這篇博客只是為了記錄自己學習過的一些知識,以前也看,但是過一段時間就忘了,所以記錄一下以便以后翻閱。學習javascript的時間也不是很長,所以有很多問題還不是很懂,希望朋友指出錯誤,共同學習,謝謝!