摘要:與執(zhí)行環(huán)境相關(guān)的變量對(duì)象中有執(zhí)行環(huán)境定義的所有變量和函數(shù)作用域鏈代碼在一個(gè)環(huán)境中執(zhí)行,便會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈。
執(zhí)行環(huán)境
執(zhí)行環(huán)境是什么?
作用域鏈javascript的解釋器每次開始執(zhí)行一個(gè)函數(shù)時(shí),都會(huì)為每個(gè)函數(shù)創(chuàng)建一個(gè)執(zhí)行環(huán)境(execution context)。
執(zhí)行環(huán)境定義了變量或者函數(shù)有權(quán)訪問(wèn)的其他數(shù)據(jù),決定了他們各自的行為。
與執(zhí)行環(huán)境相關(guān)的變量對(duì)象(ariable object)中有執(zhí)行環(huán)境定義的所有變量和函數(shù)
代碼示例代碼在一個(gè)環(huán)境中執(zhí)行,便會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈(scope chain)。
作用域鏈的作用是,保證對(duì)執(zhí)行環(huán)境有權(quán)訪問(wèn)的所有變量和函數(shù)的有序訪問(wèn)
如果環(huán)境是函數(shù),則其活動(dòng)對(duì)象(active object)為環(huán)境變量
活動(dòng)對(duì)象最開始含有一個(gè)變量,名為arguments對(duì)象(該變量全局中不存在)
作用域鏈的下一個(gè)對(duì)象來(lái)自包含對(duì)象,再下一個(gè)對(duì)象來(lái)自下一個(gè)包含環(huán)境...
標(biāo)識(shí)符的解析是沿著作用域鏈逐級(jí)向上搜索標(biāo)識(shí)符的過(guò)程
通過(guò)try catch/with 來(lái)延長(zhǎng)作用域
沒(méi)有塊級(jí)作用域(類C的花括號(hào))
var color = "blue"; function changeColor(){ if(color == "blue"){ color = "red"; }else{ color = "blue"; } } changeColor(); alert(color); // red
var color = "blue"; function changeColor(){ var anotherColor = "red"; function swapColor(){ var tempColor = anotherColor; anotherColor = color; color = tempColor; // 能訪問(wèn) color和anotherColor,tempColor } // 能訪問(wèn) color和anotherColor swapColor(); alert(color); alert(anotherColor); } // 能訪問(wèn) color changeColor(); alert(color); alert(anotherColor); //不能被訪問(wèn)到 undefined小結(jié)// 函數(shù)定義的三種方式 // 函數(shù)聲明 function sum(num1,num2){ return num1 + num2; } // 函數(shù)表達(dá)式 var sum = function(num1,num2){ return num1 + num2; }; // 使用Function構(gòu)造函數(shù) 兩次代碼解析性能慢 不推薦 var sum = new Function("num1","num2","return num1 + num2");
####js 垃圾回收 Garbage Collection(GC) > - javascript具有自動(dòng)垃圾回收機(jī)制 - 兩種策略,標(biāo)記清除和引用計(jì)數(shù) ?- 標(biāo)記清除(較為常見),第一遍標(biāo)記所有變量,第二次標(biāo)記待清除變量 - 引用計(jì)數(shù),通過(guò)檢測(cè)變量引用次數(shù)的值判定是否變量可以被回收,問(wèn)題是存在循環(huán)引用問(wèn)題 ####Function 類型 > - 每個(gè)函數(shù)都是Function類型的實(shí)例 - 函數(shù)是對(duì)象,具有屬性和方法,函數(shù)名實(shí)際上便是指向函數(shù)對(duì)象的指針 - 函數(shù)定義的三種方式 - 函數(shù)沒(méi)有重載,后定義的會(huì)覆蓋之前的 - 將函數(shù)名作為變量進(jìn)行傳參 - 函數(shù)的兩個(gè)內(nèi)部屬性**`arguments`**和**`this`**還有一個(gè)**`caller`** - 函數(shù)的屬性(有個(gè)疑問(wèn),和內(nèi)部屬性什么區(qū)別么),兩個(gè)`length`(參數(shù)個(gè)數(shù))和`prototype` - 兩個(gè)非繼承方法`apply()` `call()` ####代碼示例 *函數(shù)的三種定義方式*// 可以訪問(wèn)sum alert(sum(10,10)); function sum(num1,num2){ return num1 + num2; } // 函數(shù)表達(dá)式則不行 alert(sum1(10,10)); var sum1 = function(num1,num2){ return num1 + num2; }?*函數(shù)聲明提升(function declaration hositing)*
function callSomeFunction(someFunction,someArgument){ return someFunction(someArgument); } function add10(num1){ return num1 + 10; } var result = callSomeFunction(add10,10); alert(result);這是因?yàn)榻馕銎髟谙驁?zhí)行環(huán)境加載數(shù)據(jù)時(shí)候,對(duì)于函數(shù)聲明和函數(shù)表達(dá)式,解析器會(huì)率先讀取函數(shù)聲明,使其在任何代碼之前可用(可以訪問(wèn)) *作為值的函數(shù),函數(shù)名做為變量進(jìn)行傳參*
function factorial(num){ if(num <= 1){ return 1; }else{ // return num * factorial(num - 1); return num * arguments.callee(num - 1); } } var trueFactorial = factorial; factorial = function(){ return 0; } alert(trueFactorial(5)); // 120 alert(factorial(5)); // 0
*函數(shù)的內(nèi)部屬性* arguments對(duì)象上一篇筆記提及,類數(shù)組對(duì)象包含傳入函數(shù)的所有參數(shù) arguments對(duì)象擁有一個(gè)名為 `callee`的屬性,該屬性是一個(gè)指針,指向arguments對(duì)象的函數(shù) 它的作用:window.color = "red"; var o = { color:"blue" }; function sayColor(){ alert(this.color); } sayColor(); o.sayColor = sayColor; // 函數(shù)名是指向函數(shù)的指針 o.sayColor();`callee`作為指針的用法,解除了函數(shù)體內(nèi)代碼和函數(shù)名的耦合 **`this`**(很重要,要理解掌握) this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象或者說(shuō)是this值(全局作用域調(diào)用函數(shù)時(shí),this指向的引用就是window)
// apply() call() bind() function sum(num1,num2){ return num1 + num2; } function applySum(num1,num2){ return sum.apply(this,arguments); // 傳入arguments // return sum.call(this,[num1,num2]; //或者傳入數(shù)組 } alert(callSum(10,10)); function callSum(num1,num2){ return sum.call(this,num1,num2); } alert(callSum(10,10));可以通過(guò)調(diào)試代碼,查看當(dāng)前所在的this指向的環(huán)境對(duì)象 **疑問(wèn):如果window.color 直接寫color/var color,不是應(yīng)該也是指向全局的么,為什么會(huì)報(bào)undefined** *兩個(gè)非繼承的方法apply() call()*
window.color = "red"; var o = { color:"blue" }; function sayColor(){ alert(this.color); } var objectSayColor = sayColor.bind(o); // bind方法 傳入對(duì)象o objectSayColor(); sayColor(); sayColor.call(this); sayColor.call(window); sayColor.call(o);?*apply()和call() 的作用在于 擴(kuò)充函數(shù)作用域(不明覺(jué)厲)*
執(zhí)行環(huán)境的概念
什么是作用域,作用域鏈的作用
函數(shù)是個(gè)對(duì)象,有相應(yīng)的屬性和方法
前面的哪個(gè)疑問(wèn) 是什么原因?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91491.html
摘要:的理解函數(shù)與其他語(yǔ)言函數(shù)最大的不同在于,其不介意傳入多少參數(shù)以及參數(shù)的類型比如函數(shù)的形參有兩個(gè),但是調(diào)用函數(shù)傳入的參數(shù)可以寫一個(gè),三個(gè)或不寫參數(shù)對(duì)應(yīng)等,解析器都可以正常解析,這是因?yàn)橹袇?shù)在內(nèi)部是以一個(gè)數(shù)組形式來(lái)表示,故而不需要關(guān)系傳入?yún)?shù) ECMAScript function的理解 ECMAScript 函數(shù)與其他語(yǔ)言函數(shù)最大的不同在于,其不介意傳入多少參數(shù)以及參數(shù)的類型...
摘要:元素,當(dāng)瀏覽器不支持腳本數(shù)據(jù)結(jié)構(gòu)有如下中基本數(shù)據(jù)結(jié)構(gòu)操作符,用來(lái)檢測(cè)給定變量的數(shù)據(jù)類型結(jié)果都是,聲明沒(méi)初始化,使用生命變量但未對(duì)其進(jìn)行初始化的,默認(rèn)沒(méi)有進(jìn)行聲明,傳遞給函數(shù)會(huì)導(dǎo)致一個(gè)錯(cuò)誤,對(duì)于未聲明變量這么操作沒(méi)什么意義比如,也是返回。 javascript簡(jiǎn)史 微軟IE和網(wǎng)景在瀏覽器上的競(jìng)爭(zhēng) ECMAScript,由ECMA-262定義,提供核心語(yǔ)言功能 `ECMA 歐洲計(jì)算機(jī)制...
showImg(http://img3.douban.com/lpic/s8958650.jpg); 0x00 javascript組成 ECMAScript(-265)核心語(yǔ)言部分 DOM文檔對(duì)象模型(DOM1、2、3) BOM瀏覽器對(duì)象模型(提供與瀏覽器交互的接口和方法) 0x01 async 異步加載 執(zhí)行順序不定 charset defer 延遲加載,立即下載腳本但不執(zhí)行 src ...
摘要:標(biāo)識(shí)符按以下規(guī)則組合第一個(gè)字符必須是一個(gè)字母,下劃線或一個(gè)美元符號(hào)。包含值的變量和尚未定義的變量是不一樣的,例子報(bào)錯(cuò)然而,對(duì)未初始化的變量執(zhí)行操作符會(huì)返回值,對(duì)未聲明的變量執(zhí)行操作符統(tǒng)一也會(huì)返回值。 1. 語(yǔ)法 1.1 區(qū)分大小寫 變量、函數(shù)名和操作費(fèi)都區(qū)分大小寫。 1.2 標(biāo)識(shí)符 標(biāo)識(shí)符指變量、函數(shù)、屬性的名字,或者函數(shù)的參數(shù)。標(biāo)識(shí)符按以下規(guī)則組合: 第一個(gè)字符必須是一個(gè)字母,下劃線...
摘要:在這種情況下,函數(shù)在停止執(zhí)行后將返回值。這種用法一般用在需要提前停止函數(shù)執(zhí)行而又不需要返回值的情況下嚴(yán)格模式對(duì)函數(shù)有一些限制不能把函數(shù)命名為或不能把參數(shù)命名為或不能出現(xiàn)兩個(gè)命名參數(shù)同名的情況。 把近期看高程這本書做的筆記摘錄整理出來(lái)了,總歸對(duì)原生javascript理論有了一個(gè)比較全面的的認(rèn)識(shí),這次把書中的一些知識(shí)要點(diǎn)摘錄出來(lái)了,便于以后查閱的時(shí)候有方向,也更有效率??! 第一章、jav...
閱讀 3484·2023-04-25 18:14
閱讀 1588·2021-11-24 09:38
閱讀 3301·2021-09-22 14:59
閱讀 3112·2021-08-09 13:43
閱讀 2628·2019-08-30 15:54
閱讀 608·2019-08-30 13:06
閱讀 1611·2019-08-30 12:52
閱讀 2764·2019-08-30 11:13