JavaScript細節成敗
1、var
眾所周知var用來定義變量 如 undefined,number,string,bool,array,function,object,null。
但有時候為了省事,就會出現一些內存泄露的情況:
function fun(){
var a=b=1;//為了省事直接賦值
}
fun();
console.log(a);//undefined;
console.log(b);//1 此時b成了全局變量
function fun(){
a=1;
var a=2;
console.log(a);//2;
}
fun();
console.log(a);//undefined; 編譯時 變量 會默認轉到上下文的首行,因此a不是全局變量
2、for循環
var arr=[1,2,3];
for(var i=0;i<arr.length;i++){
arr.push(i);//會出現死循環,數組push一個值會改變自身的length,而for一直會計算arr.length
//1、耗廢性能
//2、循環修改數組不註意的情況下會出現意外的BUG
}
console.log(i);// 4 變量i可能不被註意,一直存在該上下文的作用域 。
//修改之後
var arr=[1,2,3];
var i,max;
for(i=0,max=arr.length;i<max;i++){
arr.push(i);
}
console.log(i);// 4
console.log(arr);//[1, 2, 3, 0, 1, 2]
3、new
var Person=function(name,age){
this.name=name;
this.age=age;
}
var per=new Person(‘張三‘,17);
上面new所完成的動作:
一、創建一個新對象;
二、將構造函數的作用域賦給新對象(因此this就指向了新對象);
三、執行構造函數中的代碼(為這個新對象添加屬性);
四、返回新對象賦值給per(this指向per);
4、function
function即是函數,也是構造函數,還可以是對象。
var fun=function(){
console.log(this.a);
this.c="345";
};//函數
fun.a="123",fun.b="234";//對象
var tempFun=new fun();//構造函數 輸出123
console.log(tempFun.a);//undefined
5、this
執行上下文(EC):每當控制轉移到一段可執行代碼時,控制就進入一個執行上下文。每一個函數的返回都會退出當前的執行上下文。
this:執行上下文(EC)中的一個屬性,在進入上下文時確定。
//閉包經典例子
var temp=1;
function fun(){
console.log(this);
var temp=0;
return function(){
console.log(this);
this.temp+=1;
console.log(this.temp);
}
}
var fun2=new fun();//new會創建新對象,並執行函數 運行時this指向創建對象(未命名,調試器用fun表示) 再賦值給fun2
fun2();//(因為fun2是全局對象,即this=window) 輸出2
6、()括弧
1、(a+b) 表達式
2、a() 進入執行上下文(運行函數)
怎麽區分呢
我的理解是 當"("前面是+、-、*、/、%、=、!等運算符時做為表達式處理;其它就會當做執行函數處理
7、[ ] 索引
var a=1;
a[0]=2;
console.log(a[0]);//undefined
javascript所有對象都會提供get和set的函數("引用類型"object function array string等 可以get到值,但"值類型"number 不行)
8、{ }
1、創建一個新對象 var obj={};
2、創建一個局布上下文(只有function可以)
for(int i=0;i<2;i++){
var a=i;
}
console.log(a);//2 for、switch、if等循環不能創建
9、執行上下文、變量對象、作用域鏈
1、執行上下文(EC) 上面說了只有function可以創建一塊局部的上下文,當前上下文被載入內存的時候 就變成了執行上下文
2、變量對象(VO) 與執行上下文相關的特殊對象 儲存上下文中的聲明
2.1、變量(函數內聲明的變量)
2.2、函數的聲明
2.3、函數的形參
3、作用域鏈(Scope) 作用域是上下文中所有變量對象(包括父變量對象)的列表
JavaScript細節成敗