码迷,mamicode.com
首页 > Web开发 > 详细

js中的预解释

时间:2016-06-03 00:57:50      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:

在js中,带var 和function关键字的需要预解释:

那什么是预解释?就是在js代码执行之前,先申明好带有var 关键字和带有function关键字的变量,在内存里先安排好。但是带有var关键字的和带有function关键字的预解释是有区别的:

1.带有function关键字的,在整个js脚本执行之前,就已经把函数名在内存里安排好了,并且给这个函数名赋值了,就是把函数体也赋值给了函数名;

例如:fn1();

function fn1(){alert(‘this is fn1‘)};

当你在调用的fn1的时候,fn1已经申明并且赋值了,哪里都可以调用;

2.带有var关键字的,在js申明的时候只是申明有这个变量了,不给赋值,在预解释完成之后运行js代码的时候才给赋值;

例如:

console.log(a)//undefined

var a=‘123‘;

console.log(a)//123

在预解释的时候只是申明了这个变量a,没有给a赋值,所以第一个打印出来的是undefined

第二次打印的时候,a已被赋值,所以他的结果是123;

下面是一道面试题:

var m=0;

var n=1;

function fn(){

    alert(n);

    alert(m);

    n=4;

   var  n=5;

   alert(n)

}

fn();

请问输出结果是什么?

这个面试题主要考的就是作用域和预解释。

首先预解释m,n,fn;

接着执行代码:给m赋值0,给n赋值1,执行函数fn;

执行函数fn的时候,在fn这个作用域里还要一次预解释:

首先申明变量n;

接着执行函数体里面的语句:

alert(n),这个n是哪里的n?首先要在当前作用域里面找这个n,由于上一步在这个函数作用域内已经申明了这个n,n此时还是未定义,所以此时输出的是undefined;

接着alert(m),这里的m是哪个m?首先还是在当前的作用域里面找,没有找到,继续往上一级作用域(window)找,结果在上一级作用域里面找到了m,这个已经是被赋值了,所以输出为1;

接着n=7,这个n被赋值了4,代码继续执行,n又被赋值为5,

接着又有个alert(n),此时的n就是这个函数的私有作用域里面的n,而且被赋值为6.所以alert(n)是6.。。。。+

js中的预解释

标签:

原文地址:http://www.cnblogs.com/-youth/p/5554857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!