js中的预解释
Posted 落花有情随流水,流水无情怨落花
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js中的预解释相关的知识,希望对你有一定的参考价值。
在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中的预解释的主要内容,如果未能解决你的问题,请参考以下文章