javascript
JavaScript作用域学习笔记(ife2015spring学习心得)
本文參照以下兩位前輩的文章,加上自己的見解,有錯誤之處還望大家指出
鳥哥:Javascript作用域原理
理解 JavaScript 作用域和作用域鏈
?
為什么要理解作用域
初學js便聽人說這門語言作用域比較特殊,與c/c++實現的方式不大相同,下面就遇到問題了
遇見的問題
1 var name="xiaoming" 2 function show(){ 3 console.log(name); 4 var name="WebWhiteCoder"; 5 var age; 6 console.log(name); 7 console.log(age); 8 } 9 show();按照一般的想法,輸出的結果應該是這樣的
xiaoming WebwhiteCoder undefined但實際情況呢?
此時第一行聲明的全局變量name卻變成了undefined,function內的name卻正常輸出,原因何在?
答案是js的作用域鏈
js的作用域鏈:
在介紹作用域鏈之前,大家一定都明白這句話:js中一切皆為對象.上文那段代碼定義的函數也是一個對象。
js解析器不是自上而下的一條一條按照順序來解析代碼。
原因:echo函數被調用的時候,echo的活動對象已經被創建
[callObj]={name:undefined; }這時候活動對象已經存在了一個name屬性,且是undefined。此時全局變量中的name就被覆蓋了。
注意:函數的scope屬性是在定義完函數就決定了的,而不是調用的時
function factory() {var name = 'laruence';var intro = function(){alert('I am ' + name);}return intro; }function app(para){var name = para;var func = factory();func(); }app('eve');輸出的結果:
I am laruence先把這幾個函數的作用域鏈上的活動屬性寫出來吧
app:
para:eve;name:undefined;
func:undefined;
factory:
name:undefined; intro:undefined;那么問題來了,這個時候為什么name是undefined,明明已經對其賦值了啊?這里引用鳥哥的描述 在調用函數執行之前, 會首先創建一個活動對象, 然后搜尋這個函數中的局部變量定義,和函數定義, 將變量名和函數名都做為這個活動對象的同名屬性, 對于局部變量定義,變量的值會在真正執行的時候才計算, 此時只是簡單的賦為undefined。
無疑,這時候的name是一個局部變量,只有在真正執行的時候,也就是用到name的時候才會考慮到值,此時只是簡單的賦給他undefined;
intro:
name:laruence;此時用alert彈出name的值了吧,那么此時name就取得值。
頭疼的預編譯:
眾所周知,js有變量提示的特性.如下面這個例子:
alert(name); var name="WebWhiteCoder";這時候正常彈出值:WebWhiteCoder.這就是因為變量提示的特點。
函數定義式也具有這個特點,但函數表達式就不行了.
<script>alert(typeof eve); //結果:functionalert(typeof walle); //結果:undefinedfunction eve() { //函數定義式alert('I am Laruence');};var walle = function() { //函數表達式 }alert(typeof walle); //結果:function </script>?
轉載于:https://www.cnblogs.com/WebWhiteCoder/p/7120799.html
總結
以上是生活随笔為你收集整理的JavaScript作用域学习笔记(ife2015spring学习心得)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5 + CSS 左右排版自适应高
- 下一篇: c++------------提取文件中