- 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語句用於對對象的屬性進行循環操作。