1. 程式人生 > >JavaScript細節成敗

JavaScript細節成敗

形參 聲明 當前 類型 情況下 ring 不能 自身 直接

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細節成敗