js學習筆記(6)——作用域、對象、構造函數

  • js作用域:
    概念:就是代碼名子(變量)在某個範圍內起作用和效果,目的是爲了提高程序的可靠性,更重要的是減少命名衝突。

js作用域(es6)之前:全局作用域 局部作用域

**全局作用域:**整個script標籤或者是單獨的js文件
**局部作用域:(函數作用域)**在函數內部就是局部作用域,這個代碼的名子只在函數內部起效果和作用。

  • 變量作用域:
    在javasc中,根據作用域不同,變量可分爲兩種:(1)全局變量:在全局作用域下的變量,在全局下都可以使用;(2)局部變量:在局部作用域下的變量;
    ***注意:***(1)如果在函數內部,沒有聲明直接賦值的變量也屬於全局變量;(2)函數的形參也可以看作是局部變量;
<script>
function fun(){
			var num1 = 10;  //num1 就是局部變量  只能在函數內部使用
			num2 = 20;
		}
		fun();
        console.log(num2);  //20
</script>s
  • 從執行效率來看全局變量和局部變量:
    (1)全局變量只有瀏覽器關閉的時候纔會銷燬,比較佔內存資源;
    (2)局部變量當我們程序執行完畢就會銷燬,比較節約內存資源;

  • 作用域鏈
    作用域鏈:內部函數訪問外部函數的變量,採取的就是鏈式查找的方式來決定取哪個值,這種結構我們稱爲作用域鏈。(就近原則)
    (1)只要是代碼,就至少有一個作用域
    (2)寫在函數內部的局部作用域
    (3)如果函數中還有函數,那麼在這個作用域中又可以誕生一個作用域
    (4)根據在內部函數可以訪問外部函數變量的這種機制,用鏈式查找決定哪些數據能夠被內部函數訪問,就稱作作用域鏈

<script>
		var a = 1;
		function fn1(){
			var a = 2;
			var b = '22';
			fn2();
			function fn2(){
				var a = 3;
				fn3();
				function fn3(){
					var a = 4;
					console.log(a);  // 4
					console.log(b);  //字符型  22
				}
			}
		}
		fn1();
</script>
  • 預解析
    JavaScript代碼是由瀏覽器中的JavaScript解釋器來執行的,JavaScript解析器在運行JavaScript代碼的時候分爲兩步:預解析和代碼執行
    (1)預解析:js引擎會把js裏面所有的var還有function提升到當前作用域的最前面
    (2)代碼執行:按照代碼書寫的順序從上往下執行
    2.預解析分爲變量預解析(變量提升)和函數預解析(函數提升)
    (1)變量提升:就是把所有變量聲明提升到當前的作用域最前面,不提升賦值操作
    (2)函數提升:就是把所有函數聲明提升到當前作用域的最前面,不調用函數
  • js對象
    1.什麼是對象?
    在JavaScript中,對象是一組無序的相關屬性和方法的集合,所有的事物都是對象,例如:字符串,數值,數組,函數等。
    2.對象是由屬性和方法組成的
    屬性:事物的特徵,在對象中用屬性來表示(常用名詞)
    方法:事物的行爲,在對象中用方法來表示(常用動詞)
    3.爲什麼需要對象
    JS中的對象表達結構更清晰,更強大,
    4.創建對象的三種方法
    (1)對象字面量:就是花括號{}裏面包含了表達這個具體事物(對象)的屬性和方法。
<script>
		//1.var obj = {}; //創建了一個空對象
		var obj = {
			uname:'zhangsanfeng',
			age: 18,
			sex: '男',
			sayHi:function() {
				console.log('hi~');
			}
		}
		//(1)裏面的屬性或者方法我們採取鍵值對的形式  鍵  屬性名 : 值  屬性值
		//(2)多個屬性之間用逗號隔開
		//(3)方法冒號後面跟的是一個匿名函數
		//2.使用對象
		//(1)調用對象的屬性 我們採取  對象名.屬性名  .  我們理解爲的
		console.log(obj.uname);
		//(2)調用屬性還有一種方法  對象名['屬性名']
		console.log(obj['age']);
		//(3)調用對象的方法 say.hi  對象名.方法名()
		obj.sayHi();
</script>
<script >
		//變量、屬性、函數、方法的區別
		//1.變量和屬性的相同點:它們都是用來儲存數據的
		var num = 10;
		var obj = {
			age:18
		}
		console.log(obj.age);
		//console.log(age);
		//變量  單獨聲明並賦值  使用的時候直接寫變量名 單獨存在
		//屬性  在對象裏面不需要聲明的  使用的時候必須是 對象.屬性
		//2.函數和方法的相同點  都是實現某種功能 做某件事
		//函數是單獨聲明  並且調用的 函數名()單獨存在   方法  在對象裏面  調用的時候  對象.方法()           
</script>

(2)利用·new object 創建對象

<script>
		//利用 new object  創建對象
		var obj = new Object();
		obj.age = 18;
		obj.sex = '男';
		obj.sayHi = function() {
			console.log('hi');
		}
		//(1)我們是利用 等號 =  賦值的方法  添加對象的屬性和方法
		//(2)每個屬性和方法之間用 分號結束

		console.log(obj.age);
		console.log(obj['sex']);
		obj.sayHi();
</script>

3.利用構造函數創建對象
構造函數:是一種特殊的函數,主要用來初始化對象,即爲對象成員變量賦初始值,它總與new運算符一起使用,我們可以把對象中一些公共的屬性和方法抽取出來,然後封裝到這個函數裏。
構造函數注意點:1.構造函數名子首字母要大寫; 2.我們構造函數不需要return 就可以返回結果; 3.我們調用構造函數必須使用new關鍵字
對象 是一個具體的事物;構造函數 泛指的某一大類 類似於Java中的類(class);
我們利用構造函數創建對象的過程我們也稱爲對象的實例化。

4.new關鍵字
(1)new構造函數可以在內存中創建了一個空對象
(2)this 就會指向剛纔創建的空對象
(3)執行構造函數裏面的代碼,給這個對象添加屬性和方法(所以構造函數不需要return)

<script>
		var obj = {
			name:'pink',
			age:18,
			sex:'男',
			fn: function(){}
		}
		// console.log(obj.name);
		// console.log(obj.age);
		// console.log(obj.sex);

		//for  in  遍歷對象
		//for  (變量 in  對象) {

		//}

		for(var k in obj){
			console.log(k);  //k變量 輸出得到的是屬性名
			console.log(obj[k]);  //obj[k] 得到的是屬性值
		}
</script>

小結:1.對象可以讓代碼結構更清晰;
2.對象複雜數據類型object;
3.本質:對象就是一組無序的相關屬性和方法的集合;
4.構造函數泛指某一大類;
5.對象實例特指一個事物;
6.for…… in語句用於對對象的屬性進行循環操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章