JavaScript细节成败

众所周知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) 作用域是上下文中所有变量对象(包括父变量对象)的列表

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzzgj.html