JavaScript鏈式作用域
阿新 • • 發佈:2019-01-22
網上介紹js鏈式作用域的很多,但寫的很煩雜,不好理解,現在根據網路文章整理一個簡單易懂的,如下:
2)js中當前作用域能訪問其上層作用域的變數和函式
JavaScript中的函式執行在他們被定義的作用域裡,而不是他們被執行的作用域裡。
這句話很難理解,但是換做簡單的描述,JS的鏈式作用域就是:
JS中當遇到對變數名或者函式名的使用時,會首先在當前作用域查詢變數或者函式,如果沒有找到,就會到其上層作用域中尋找,並以此類推。
1.理解js的鏈式作用域的前提
1)首先要知道js的變數作用域,js的變數作用域就兩種:全域性和區域性2)js中當前作用域能訪問其上層作用域的變數和函式
2.js鏈式作用域的定義:
JS權威指南的描述:JavaScript中的函式執行在他們被定義的作用域裡,而不是他們被執行的作用域裡。
這句話很難理解,但是換做簡單的描述,JS的鏈式作用域就是:
JS中當遇到對變數名或者函式名的使用時,會首先在當前作用域查詢變數或者函式,如果沒有找到,就會到其上層作用域中尋找,並以此類推。
下面這個例子在很多博文中引用:
var x = 10;
function test() {
alert(x);
}
test();
上面例子中彈出的值是什麼? 答案是10,這個很好理解,因為上面提到:
2)js中上層物件中的變數和函式對其子物件都是可見的
下面對這個例子稍微變換下:
var x = 10;
function test() {
alert(x);
var x = 2;
}
test();
改變後的例子彈出的值是什麼?答案是undefined,如果用java等其他程式語言的思維分析很理解,但利用JS鏈式作用域來理解,函式test在執行時,會先在其本身的作用域中尋找,而函式本中是定義了x的,就不會在向上層尋找,但是是定義在alert之後,因此alert會彈出undefined,如果函式內沒有定義x,就像最初的例子,那麼就會在其上層作用域尋找,就是10