作用域有:全域作用域和區域作用域
var 除了函式的{}之外,其他地方都不會認為是子作用域 let 在任意{ }里面,如果用的是let關鍵詞定義的變數,那么這個{}視為一個子作用域,在for的()里面,用let定義變數,視為子作用域.Var的決議
1. 定義 -- 找出變數 (找當前作用域所有的 var、function 兩個關鍵詞定義出來的變數) 2. 執行 -- 從上到下,執行代碼 (取值,就近原則,當前作用域有值就取當前,沒有就取父級)舉例說明如下:
var x = 5; a(); function a(){ alert(x); var x = 10; } alert(x); /* * 1. 定義 * 15:var x; * 17-20: function a(){...} * * 2. 執行 * 15: x=5; * 16: a(); ==子作用域==> 1. 定義 * 19: var x; * 2. 執行 * 18: alert(x); //undefined * 19: x = 10;(改變的是自己作用域的x) * 21: alert(x); //5 * * * */
重名注意事項(var,function,let)
1. let :同作用域下,let 不允許重名 2. var 與 function 可以重名注 :1.var var重名,就當成同一個變數來看 2. function function重名,以最后面的對準. 3. var function重名,(1.定義)程序中,以function為準 4. 執行后重新賦值,以賦值的值為準
舉例說明如下:
alert(a); var a = 10; alert(a); function a(){alert(20)} alert(a); var a = 30; alert(a); function a(){alert(40)} alert(a); /* * 1. 定義 * 22: function a(){alert(40)} * * 2. 執行 * 15: alert(a); // 列印函式體function a(){alert(40)} * 16: a = 10; * 17: alert(a); // 10 * 19: alert(a); // 10 * 20: a = 30; * 21: alert(a); // 30 * 23: alert(a); // 30 * * */
閉包
含義: 函式里面嵌套一個函式,內部函式使用了外部函式的引數/變數,形成閉包. 在一個作用域中包含一個作用域,子作用域使用了父作用域的 引數/變數 ,形成閉包.舉例說明如下:
(function(){ let a = 10; document.onclick = function(){ a ++; console.log(a); }; })(); /* function a(){ let x = 20; return function() { x ++; console.log(x); } } let b = a(); */ /* b(); b(); b(); b(); b(); let c = a(); c(); c(); c(); c(); c(); */
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/254387.html
標籤:其他
