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