摘要:特別注意的是不用聲明的變量那么他歸所有也就是全局作用域所有。如果到達全局作用域但是這個變量仍未找到,則會拋出異常。語句結束后,作用域鏈恢復正常。
1.javascript不管是變量(or 叫變量表達式?或者變量的聲明與賦值吧 var scope="loacal")的聲明還是函數(or 函數表達式)的聲明,都遵循命名在當前作用域前置(提升到當前命名空間頂端)函數體保留在原地。
var scope="global";//全局變量 function text(){ console.log(scope);//輸出為undefined var scope="local"; console.log(scope);//輸出為local } text();
而上面的代碼等價于
var scope; scope="global" function text(){ var scope; //命名前置 console.log(scope);//輸出為undefined scope="local"; console.log(scope);//輸出為local } text();
換成函數
text1(); function text1(){//函數的聲明 alert(1);//彈出1 } text2(); var text2=function(){//函數表達式 alert(1);//undefined is not a function } //上面的函數表達式聲明等價于 var text3;//聲明前置 text3(); text3=function(){//函數體留在原地 alert(1); }2.javascript只有函數級作用域沒有塊級作用域。
var name="golbar"; if(true){ var name="local"; console.log(name);//輸出local } console.log(name);//也輸出local
如果存在塊級作用域那么第一個值為local第二個值為golbar。
塊級作用域指的是能用for if while 等代碼塊形成的獨立作用域,即為塊級作用域。
特別注意的是不用var 聲明的變量那么他歸window所有也就是全局作用域所有。
每次引用一個變量,JavaScript 會向上遍歷整個作用域直到找到這個變量為止。如果到達全局作用域但是這個變量仍未找到,則會拋出 ReferenceError 異常。
function text(){ log="in function"; console.log(log); }; text(); console.log(window.log)//都輸出為 in function
還有個就是作用域鏈:一個函數體重嵌套了多層函數體,并在不同的函數體中定義了同一個變量,當其中一個函數訪問這個變量時,變會形成一條作用域鏈 scope chain
chain="window"; function one(){ var chain="one"; function two(){ var chain="two"; console.log(chain); }; function three(){ console.log(chain); }; two(); three(); }; one(); //two one console.log(chain);// window
作用域鏈有個特殊情況就是with語句:JS中的with語句主要用來臨時擴展作用域鏈,將語句中的對象添加到作用域的頭部。with語句結束后,作用域鏈恢復正常。
chain="window"; function one(){ var chain="one"; function two(obj){ console.log(chain);//輸出為one with(obj){ console.log(chain)//輸出為obj } } var obj={chain:"obj"}; two(obj); } one();
還有就是編寫代碼的時候雖然JS可以不用;或者相直接 if(true) return; 但盡量不要這樣寫。至于為什么的話以后會寫。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86554.html
摘要:對于新手來說是最令人困惑的部分之一。函數聲明通過的形式。很明顯的,語言自身定義和函數形參已經處于作用域頂端。這就意味著,函數聲明比變量聲明具有更高的優先級。但是這卻不意味著對這個名稱的賦值無效,僅僅是聲明的部分會被忽略而已。 原文鏈接:JavaScript Scoping and Hoisting 你知道下面的JavaScript代碼執行后會alert出什么值嗎? var foo = ...
摘要:所以形式參數是本地的,不是外部的或者全局的。這叫做函數聲明,函數聲明會連通命名和函數體一起被提升至作用域頂部。這叫做函數表達式,函數表達式只有命名會被提升,定義的函數體則不會。 Scoping & Hoisting var a = 1; function foo() { if (!a) { var a = 2; } alert(a); }; ...
摘要:在中,有四種方式可以讓命名進入到作用域中按優先級語言定義的命名比如或者,它們在所有作用域內都有效且優先級最高,所以在任何地方你都不能把變量命名為之類的,這樣是沒有意義的形式參數函數定義時聲明的形式參數會作為變量被至該函數的作用域內。 Scoping & Hoisting 例: var a = 1; function foo() { if (!a) { var ...
摘要:即的變量提升此處變量未聲明時便可以使用,其實是因為會自動將聲明語句提升到頂部。但名字的初始化卻是按其在代碼中書寫的順序進行的,不受以上優先級的影響。 變量提升(hoisting) 在JavaScript中,函數、變量的聲明都會被提升(hoisting)到該函數或變量所在的scope的頂部。即——JavaScript的變量提升. var x = 5; alert(x); ...
摘要:副作用,無副作用可執行和關鍵詞。和不能像一樣同一個下聲明多次和不會像一樣變量聲明提升原因是,存在因此不能,賦值前使用變量。 showImg(https://segmentfault.com/img/bVbhPlD?w=1271&h=715); 關鍵詞: let ,const, blocking scope ,temporal dead zone,redeclaration,reassi...
閱讀 1618·2021-09-08 10:42
閱讀 3604·2021-08-11 10:23
閱讀 3959·2019-08-30 14:10
閱讀 2732·2019-08-29 17:29
閱讀 3090·2019-08-29 12:50
閱讀 637·2019-08-26 13:36
閱讀 3456·2019-08-26 11:59
閱讀 1487·2019-08-23 16:23