通常來說,一段程式代碼中所用到的名字並不總是有效和可用的,而限定這個名字的可用性的程式碼範圍就是這 個名字的作用域。作用域的使用提高了程式邏輯的區域性性,增強了程式的可靠性,減少了名字衝突。
JavaScript(es6前)中的作用域有兩種: 全域性作用域 / 區域性作用域(函數作用域)
作用於所有程式碼執行的環境(整個 script 標籤內部)或者一個獨立的 js 檔案。
作用於函數內的程式碼環境,就是區域性作用域。 因爲跟函數有關係,所以也稱爲函數作用域。
塊作用域由 { } 包括。
在其他程式語言中(如 java、c#等),在 if 語句、回圈語句中建立的變數,僅僅只能在本 if 語句、本循 環語句中使用,如下面 下麪的Java程式碼: Js中沒有塊級作用域(在ES6之前
if(true){ int num = 123; system.out.print(num); // 123 } system.out.print(num); // 報錯 |
if(true){ var num = 123; console.log(123); //123 } console.log(123); //123
|
在JavaScript中,根據作用域的不同,變數可以分爲兩種: 全域性變數 / 區域性變數
結果:123
作用域鏈:採取就近原則的方式來查詢變數最終的值
結果:4 ‘22’
1 問: console.log(num); // 結果是多少? Num is not defined . |
2 問: console.log(num);//結果是多少? var num = 10; ? undefined -à 坑1 |
3 問: fn(); function fn() { console.log('列印'); } //結果是:11 |
4 問: fn(); var fn = function() { console.log('想不到吧'); } // 函數表達式:fn()放下邊可以呼叫,放在上邊就錯了-》坑2 |
JavaScript 代碼是由瀏覽器中的 JavaScript 解析器來執行的。JavaScript 解析器在運行 JavaScript 代碼的 時候分爲兩步:預解析和代碼執行。
2.1 變量預解析(變量提升)
變量提升: 變量的聲明會被提升到當前作用域的最上面,變量的賦值不會提升
2.2 函數預解析(函數提升)
函數提升: 函數的聲明會被提升到當前作用域的最上面,但是不會調用函數
2.3 解決函數表達式聲明調用問題
相當於執行了一下操作
相當於執行了一下操作 Var num; Function fun() { Var num; Console,.log(num); num = 10; } Num = 10; Fun(); // undefined 和外邊得沒關係 |
Var num; Function fn() { Var num; Console.log(num); num = 20; Console.log(num); } Num = 10; Fn(); // undefined // 20 |
Var a Function() f1(){ Var b; Var a; B = 9; Console.log(a); Console.log(b); A = 123; } a =10; f1() // undefined // 9 |
Function f1() { Var a =b = c = 9; // var a; a = b = c = 9; // var a = 9 ; b = 9; c = 9; bc前邊沒有var=全域性變數 // 集體宣告 var a = 9, b= 9, c= 9; 這是逗號 Console.log(c); // 9 Console.log(b); // 9 Console.log(a); // 9 } F1(); Console.log(c); // 9 Console.log(b); // 9 Console.log(a); // 報錯,a是區域性變數,不能使用 aisnotdef |
1.1 什麼是對象?
1.2 爲什麼需要對象
儲存一個值時,可以使用變量,儲存多個值(一組值)時,可以使用陣列。如果要儲存一個人的完整資訊呢? 例如,將「張三瘋」的個人的資訊儲存在陣列中的方式爲: var arr = [‘張三瘋’, ‘男', 128,154];
JS 中的物件表達結構更清晰,更強大。張三瘋的個人資訊在物件中的表達結構如下:
張三瘋.姓名 = ‘張三瘋'; 張三瘋.性別 = ‘男'; 張三瘋.年齡 = 128; 張三瘋.身高 = 154; |
person.name = ‘張三瘋'; person.sex = ‘男'; person.age = 128; person.height = 154; |
利用字面量建立物件 / 利用 new Object 建立物件 / 利用建構函式建立物件
2.1 利用字面量創建對象
物件字面量:就是花括號 { } 裏面包含了表達這個具體事物(物件)的屬性和方法。
{ } 裏面採取鍵值對的形式表示
對象的呼叫:
Var obj = (); //建立一個空物件
方法後加一個匿名函數,多個屬性用逗號隔開,最後一個不要逗號
變數、屬性、函數、方法總結
2.2 利用new Object創建物件
跟我們前面學的 new Array() 原理一致
2.3 利用構造函數創建對象
構造函數 :是一種特殊的函數,主要用來初始化對象,即爲對象成員變量賦初始值,它總與 new 運算符一起 使用。我們可以把物件中一些公共的屬性和方法(重複程式碼)抽取出來,然後封裝到這個函數裏面。
在 js 中,使用建構函式要時要注意以下兩點:
function Person(name, age, sex) { this.name = name; this.age = age; this.sex = sex; this.sayHi = function() { alert('我的名字叫:' + this.name + ',年齡:' + this.age + ',性別:' + this.sex); } } var bigbai = new Person('大白', 100, '男'); var smallbai = new Person('小白', 21, '男'); console.log(bigbai.name); console.log(smallbai.name); |
注意 1. 建構函式約定首字母大寫。 2. 函數內的屬性和方法前面需要新增 this ,表示當前物件的屬性和方法。 3. 建構函式中不需要 return 返回結果。 4. 當我們建立物件的時候,必须用 new 來呼叫建構函式。
2.4 構造函數和對象
for (變數 in 物件名字) { // 在此執行程式碼 }
2. 語法中的變量是自定義的,它需要符合命名規範,通常我們會將這個變量寫爲 k 或者 key。
小結
1. 物件可以讓程式碼結構更清晰
2. 物件複雜數據型別object。
3. 本質:物件就是一組無序的相關屬性和方法的集合。
4. 建構函式泛指某一大類,比如蘋果,不管是紅色蘋果還是綠色蘋果,都統稱爲蘋果。
5. 物件範例特指一個事物,比如這個蘋果、正在給你們講課的pink老師等。
6. for...in 語句用於對物件的屬性進行回圈操作。