JS中变量定义、预解释和闭包(一)

来源:互联网 发布:p字体的软件 编辑:程序博客网 时间:2024/06/05 04:03

1.变量声明和变量定义

  • 在JS中,带var关键字或function关键字的是要预解释的,通俗点说就是在整个JS代码执行之前,先声明好带var关键字和带function关键字的变量(被提前声明),在内存里把它们安排好。但是function关键字和var关键字的预解释是有区别的。
  • 带function关键字的(就是定义函数),在整个脚本执行之前,就已经把函数名(其实就是变量名)在内存里安排好了,并且给这个函数名赋了值(就是函数体),比如下面的代码:
fn();//可以在定义之前执行function(){alert("我可以在定义之前运行")}
  • 但是var去声明一个变量的时候,只是被提前声明,不会被赋值,就是只是被预解释了,但不是执行等号的这个赋值运算。而用function去定义变量的时候,不但会被提前声明,还要被初始化一个值。
alert(a);//在定义之前就可以输出但是输出结果是undefinedvar a = "hello summer_zmc";//用var关键字定义变量aalert (a);//在定义之后,才会输出“hello summer_zmc”

说明:在JS中,初始化分三步完成:

- 1.在整段JS代码运行之前,浏览器引擎先找到所有带var关键字的变量,在内存里分配好地址,这个是声明的过程,这个过程是在代码按顺序执行之前完成的,就是说代码在未执行之前,就已经把带var关键字定义的变量安排好了,但是只把变量声明了,并没有赋值,所以执行到赋值语句之前它的值是undefined,这就是所谓的预解释机制。- 2.当代码正常执行的时候,在内存里分配一个空间保存“hello summer_zmc”这个数据。- 3.让数据“hello summer_zmc”和变量a发生关系,就是把“hello summer_zmc”赋值给变量a。这里相当于定义,此后在输出a,才是“hello summer_zmc”这个字符串。
  • 预解释(变量提声):当浏览器在解析js代码之前,把所有带var和function的都会做提前声明。但是带var的变量仅仅是把这个变量提前声明了,但是没有赋值,浏览器会默认赋值一个undefined。带function在提前声明阶段不仅仅声明了,还把函数名字赋值了,赋值就是把函数的引用地址赋值。当浏览器解析到函数代码时候由于在预解释阶段已经完成了赋值动作,所以直接跳过。

  • var和function的区别:function函数在预解释阶段就已经把值赋值完了,但是带var的在预解释阶段没有赋值,只是默认赋值了一个undefined,当代码运行到赋值那一行的时候,才把值赋值给变量。

0 0
原创粉丝点击