摘要:作用域鏈在執(zhí)行上下文創(chuàng)建的時候,在變量對象之后創(chuàng)建作用域鏈,作用域鏈本身就包含變量對象,當函數(shù)被調(diào)用的時候,作用域鏈包含的是激活對象。我們可以用這個屬性來假定作用域鏈的連接,它指的是鏈中的下一個對象。
什么是作用域
作用域是運行代碼中某些特定部分的變量,函數(shù)和對象的可訪問性及生命周期
javascript中的作用域在javascript中有兩種類型的作用域
1.全局作用域
2.局部作用域
在函數(shù)內(nèi)部定義的在局部作用域內(nèi),而在函數(shù)外定義的變量在全局作用域內(nèi),調(diào)用時的每個函數(shù)創(chuàng)建一個新的作用域
當你開始在文檔中編寫代碼時,你已經(jīng)在全局作用域內(nèi),整個js環(huán)境中只有一個全局作用域,如果在函數(shù)外部定義了一個變量,他就在全局作用域內(nèi)。
// 全局作用域 var name = "哈士奇"
全局作用域的變量可以在任何其他作用域內(nèi)訪問或更改
// 全局作用域 var name = "哈士奇"; console.log(name); // 哈士奇 //局部作用域 function logName(){ name = "泰迪"; console.log(name); } logName();局部作用域
在函數(shù)內(nèi)定義的變量在局部作用域內(nèi),對于每個函數(shù)的調(diào)用,它們都有不同的作用域,這意味著具有相同名稱變量可以用于不同的函數(shù),只是因為這些變量被綁定到它們各自的函數(shù)。每個函數(shù)具有不同的作用域,并且在其他作用域中是不可訪問的。
function foo(){ var name = "哈士奇"; console.log(name); } function bar(fn){ var name = "泰迪"; fn(); } bar(foo); // 哈士奇
無論函數(shù)在哪里被調(diào)用,也無論他如何被調(diào)用,他的作用域都只由函數(shù)聲明時的位置決定的
作用域查找會在找到第一個匹配的標識符時停止。在多層的嵌套作用域中可以可以定義同名的變量,這叫做遮蔽效應(內(nèi)部的變量遮蔽了外部的變量)
function foo(){ var name = "哈士奇" function bar(){ var name = "泰迪" console.log(name) } bar(); //泰迪 console.log(name); // 哈士奇 } foo();
javascript中的eval函數(shù)可以接受一個字符串為參數(shù),并將其中的內(nèi)容好像在書寫時就存在于程序中這個位置的代碼。
function foo(str, a){ eval(str); console.log(a, b); //欺騙 } var b = 2; foo("var b = 3;", 1); //1, 3
在執(zhí)行eval()之后的代碼時,引擎并不知道或在意前面的代碼是以動態(tài)形式插入進來,并對作用域的環(huán)境進行修改的,引擎只會如往常對詞法作用域進行查找。
像塊語句if和switch條件或while與for循環(huán)不創(chuàng)建一個新的作用域,在塊語句內(nèi)定義的變量將保留在它們已經(jīng)存在的作用域內(nèi)
if(true){ var name = "哈士奇" } console.log(name); // 哈士奇
在ES6中新增的const和let關鍵字可以在塊語句內(nèi)聲明局部作用域。
if(true){ let name = "哈士奇"; } console.log(name); // not defined執(zhí)行上下文堆棧
因為javascript是單線程語言,一次就只能執(zhí)行一個函數(shù),其他的函數(shù)會在執(zhí)行上下文中排隊,
即會形成執(zhí)行上下文堆棧。
在javascript引擎開始執(zhí)行代碼時,它進入全局執(zhí)行上下文,它是堆棧的底部和第一個元素。然后,全局代碼提供一些初始化,創(chuàng)建所需的對象和函數(shù)。在執(zhí)行全局上下文期間,其代碼可能激活一些其他(已創(chuàng)建的)函數(shù),這些函數(shù)將進入其執(zhí)行上下文,將新函數(shù)推送到堆棧上,依此類推。初始化完成后,運行時系統(tǒng)正在等待一些事件(例如用戶的鼠標點擊),這將激活一些功能,并將進入新的執(zhí)行上下文。
執(zhí)行上下文每個函數(shù)都會創(chuàng)建自己的執(zhí)行上下文,但只能有一個全局上下文。執(zhí)行上下文可以被簡單的表示一個對象,它擁有下面的屬性
變量對象是一個數(shù)據(jù)容器與執(zhí)行上下文相關聯(lián)。這是一個存儲上下文中定義的變量和函數(shù)聲明的特殊對象(請注意函數(shù)表達式)不包括在變量對象。
var name = "哈士奇" function foo(){} (function bar(){}); console.log(this.name = "哈士奇"); //true console.log(bar); //bar is not defined;
全局上下文的變量對象將具有以下屬性
當調(diào)用函數(shù)時,將創(chuàng)建一個稱為激活對象的特殊對象,他填充了形式參數(shù)和arguments對象,然后激活對象被用作函數(shù)上下文的變量對象。
function foo(x, y){ var z = 30; function bar(){} (function baz(){}); } foo(10, 20);
foo函數(shù)的上下文里有這些屬性,并且函數(shù)表達式bar沒有被包含在變量對象中。
在執(zhí)行上下文創(chuàng)建的時候,在變量對象之后創(chuàng)建作用域鏈,作用域鏈本身就包含變量對象,當函數(shù)被調(diào)用的時候,作用域鏈包含的是激活對象。
當被要求解析變量時,JavaScript始終從代碼嵌套的最內(nèi)層開始,并保持對父作用域的連接,直到找到變量或其他所需的資源。作用域鏈可以簡單地定義為包含其自己的執(zhí)行上下文的變量對象的對象,以及父作用域的所有執(zhí)行上下文。
var x = 10; (function foo() { var y = 20; (function bar() { var z = 30; console.log(x + y + z); })(); })();
我們可以用__parant__這個屬性來假定作用域鏈的連接,它指的是鏈中的下一個對象。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107016.html
摘要:作用域一作用域是什么就是變量和函數(shù)所被訪問范圍,控制變量和函數(shù)的可見性和生命周期作用域分為全局作用域和局部作用域全局作用域是指在所有函數(shù)之外聲明的變量,因為當前文檔中的其他代碼可以訪問它局部作用域是指在函數(shù)內(nèi)部聲明的變量,因為該函數(shù)只能在它 JS(JavaScript)作用域;一.作用域是什么;就是變量和函數(shù)所被訪問范圍,控制變量和函數(shù)的可見性和生命周期作用域分為全局作用域和局部作用域...
摘要:組件是最強大的功能之一。組件的創(chuàng)建和注冊我們可以使用注冊一個全局組件。父組件的數(shù)據(jù)需要通過才能下發(fā)到子組件中。如果傳入的數(shù)據(jù)不符合要求,會發(fā)出警告。這對于開發(fā)給他人使用的組件非常有用。 組件 (Component) 是 Vue.js 最強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代碼。 組件的創(chuàng)建和注冊 我們可以使用 Vue.component(tagName, opti...
摘要:對象數(shù)組初始化表達式,闖關記之上文檔對象模型是針對和文檔的一個。闖關記之數(shù)組數(shù)組是值的有序集合。數(shù)組是動態(tài)的,根闖關記之語法的語法大量借鑒了及其他類語言如和的語法。 《JavaScript 闖關記》之 DOM(下) Element 類型 除了 Document 類型之外,Element 類型就要算是 Web 編程中最常用的類型了。Element 類型用于表現(xiàn) XML 或 HTML 元素...
摘要:函數(shù)描述表示定義一段代碼,并且可重復使用函數(shù)的定義函數(shù)聲明方式字面量表達方式函數(shù)聲明方式語法函數(shù)名稱小括號不可省去函數(shù)體函數(shù)聲明方式在定義函數(shù)時,函數(shù)體中的內(nèi)容不會被執(zhí)行啞吼吼調(diào)用函數(shù)使用函數(shù)名稱調(diào)用函數(shù)的時候會執(zhí)行函數(shù)體中的內(nèi)容字面量方 函數(shù) 描述 表示定義一段JavaScript代碼,并且可重復使用 函數(shù)的定義 函數(shù)聲明方式 字面量表達方式 函數(shù)聲明方式 語法 function...
摘要:由于這種特性,某一個任務的后續(xù)操作,往往采用回調(diào)函數(shù)的形式進行定義。另外,回調(diào)函數(shù)本身的第一個參數(shù),約定為上一步傳入的錯誤對象。這種寫法有一個很大的好處,就是說只要判斷回調(diào)函數(shù)的第一個參數(shù),就知道有沒有出錯,如果不是,就肯定出錯了。 REPL環(huán)境 在命令行鍵入node命令,后面沒有文件名,就進入一個Node.js的REPL環(huán)境(Read–eval–print loop,讀取-求值-輸出...
閱讀 3071·2021-11-23 09:51
閱讀 1052·2021-09-02 15:21
閱讀 3018·2019-08-30 13:56
閱讀 1841·2019-08-29 14:12
閱讀 717·2019-08-29 13:53
閱讀 1678·2019-08-29 11:32
閱讀 1340·2019-08-29 11:25
閱讀 1504·2019-08-28 17:51