js作用域問題一步步透徹理解

2021-06-25 22:17:55 字數 2123 閱讀 3856

**守則第一條:

js沒有塊級作用域(你可以自己閉包或其他方法實現),只有函式級作用域,函式外面的變數函式裡面可以找到,函式裡面的變數外面找不到。

這是為什麼呢??

1

var a = 10;

2function aaa()

5function bbb()9//

定義了函式沒啥用,呼叫才是真格的所以這裡是step-1

10 bbb();//

step-1

其實原理大家都懂,應該就是易錯而已,萬變不離其綜。

second try:

這是為什麼呢? 因為給a賦值b的時候,b還沒有定義,所以a是undefined,b是10.

**守則第二條:

變數的查詢是就近原則,去尋找var定義的變數,當就近沒有找到的時候就去查詢外層。

這是為什麼呢、? 這裡面有兩個原因,一是預解析,二是就近查詢。

1

var a=10;

2function

aaa()

12 aaa();

attention:

這個吧,就驗證了第二條,雖然是就近原則,但是是就近找var宣告的變數,這個是因為沒有var宣告的變數是全域性的,這裡只是修改了a的值。所以上面就是因為在函式內沒找到var的a,於是到外面去找了,一找就找到了,於是a就alert出10了;不過沒錯的是a=20後,a確實為20了,只不過alert的時候還沒有執行到那~~

看吧~

下面這個例子,更加驗證了js的函式作用域 而已:

這是因為在alert(a)的時候,bbb函式中的a確實為20 ,可是它對於這時的alert(a)這句話來說是區域性的,alert(a)根本找不到bbb函式中的a,所以在aaa函式中它找不到a,於是乎去外面找,一找,就找到了10。

**守則第三條:

當引數跟區域性變數重名時,優先順序是等同的。

例:

還有:傳參時,基本型別傳值,引用型別傳引用。(但是重新賦值之後就不是這樣了喔)

1

var a = 5;

2var b =a;

3 b +=3;

4 alert(a);//55

6var a = [1,2,3];

7var b=a;

8 b.push(4);

9 alert(a);//

[1,2,3,4];

上面**沒有問題,但是下面就不一樣啦。

因為b被重新賦值了,不指向a了。

此外,引數與變數的作用域是相似的:

對比上下這兩個:

上面是引數是基本型別,只傳了值進去,下面的傳個引用型別:(同樣也包含重新賦值的情況)

一步步學ROS

最近因為看svo的 裡面用到catkin決定要好好看ros,年前學會基本操作。啟動節點 rosrun package name executable name 檢視節點 rosnode list 注 rosout 節點是乙個特殊的節點,通過 roscore 自動啟動 檢視特定節點的資訊 rosnod...

windows Thrift c 一步步搭建

1.thrift 原始碼路徑 2.libevent原始碼路徑 3.boost路徑 安裝 conan install boost 1.68.0 conan stable 4.openssl路徑 安裝 conan install openssl 1.1.1a conan stable conan安裝bo...

一步步啟動linux

可以一步一步啟動linux.在ubantu剛一啟動時,按c健即進入grub 提示符狀態,在此狀態下輸入 我用的是ubuntu 13 grub linux vmlinuz grub ls boot grub initrd boot initrd.img 3.11.0 15 generic grub b...