在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中的预解释的更多相关文章

  1. js中的预编译

    预编译 js执行顺序: 词法/语法分析 预编译 解释执行 js中存在预编译 function demo() { console.log('I am demo'); } demo(); //I am d ...

  2. 课程笔记:——javascript中的预解释2

    in:检测某一个属性是否属于这个对象(既可以检测私有的属性,也可以检测公有的属性) --> attr in obj 1.不管条件是否成立,在预解释的时候,判断体中的带var和function的都 ...

  3. 课程笔记:——Javascript 中的预解释1

    1.预解释(变量提升):在当前作用域下,JS代码执行之前,浏览器首先会把所有带var和function关键字的进行提前的声明或者定义var num = 12;声明(declare): var num; ...

  4. js中的预加载与懒加载(延迟加载)

    js中加载分两种:预加载与延迟加载 一.  预加载,增强用户的体验,但会加载服务器的负担.一般会使用多种 CSS(background).JS(Image).HTML(<img />) . ...

  5. js中Prototype属性解释及常用方法

    1.prototype的定义 javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用. 每一个构造函数都有一个属 ...

  6. JS中的预解析

    js预解析对于很多学习web前端开发的新手们很困扰,总是很难搞懂到底是个什么东西,今天零度就为大家简单的分析一下,争取让大家都明白! 首先,看一下下面的代码: alert(a); var a = 1; ...

  7. [js]js栈内存的全局/私有作用域,代码预解释

    js代码如何执行的 浏览器提供执行环境: 全局作用域(提供js执行环境, 栈内存) --> 执行js需要预解释 - 带var : 提前声明 - 带function关键字的: 提前声明+定义 js ...

  8. 关于javascript中私有作用域的预解释

    1.如何区分私有变量还是全局变量 1).在全局作用域下声明(预解释的时候)的变量是全局变量 2).在“私有作用域中声明的变量”和“函数的形参”都是私有变量 在私有作用域中,我们代码执行的时候遇到一个变 ...

  9. JavaScript提高篇之预解释作用域以及this原理及其应用

    1.预解释 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

随机推荐

  1. NS3网络仿真(7): Wifi节点

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在上一节中.我们仿真了一个总线型网络,这一节尝试将上一节中的n0变成一个无线的AP.再连上几个节点 ...

  2. 线程池ThreadPoolExecutor分析

    线程池.线程池是什么,说究竟,线程池是处理多线程的一种形式,管理线程的创建,任务的运行,避免了无限创建新的线程带来的资源消耗,可以提高应用的性能.非常多相关操作都是离不开的线程池的,比方android ...

  3. CSS transform旋转问题

    我们都知道css的transform可以让旋转多少角度:transform:rotate(90deg),但是设置后只能旋转一次,如何想让它一直旋转下去怎么办?一种是使用matrix属性获取当前tran ...

  4. 基于redis集群实现的分布式锁,可用于秒杀商品的库存数量管理,有測试代码(何志雄)

    转载请标明出处. 在分布式系统中,常常会出现须要竞争同一资源的情况,本代码基于redis3.0.1+jedis2.7.1实现了分布式锁. redis集群的搭建,请见我的另外一篇文章:<>& ...

  5. Spark 学习笔记:(三)Spark SQL

    参考:https://spark.apache.org/docs/latest/sql-programming-guide.html#overview http://www.csdn.net/arti ...

  6. python day- 16 面向对象

    1.类的相关知识 类:是指具有相同属性和技能的一类事物. 比如:人类 ,植物类,动物类,狗类. 对象:是类中的某一个实例,是类的具体表现. 比如:具体到某个人,某一个植物,某一条狗. class 是p ...

  7. mvn_action

    validate(验证): 验证项目正确,并且所有必要信息可用. compile(编译): 编译项目源码 test(测试): 使用合适的单元测试框架测试编译后的源码. package(打包): 源码编 ...

  8. FZU2150 Fire Game —— BFS

    题目链接:https://vjudge.net/problem/FZU-2150 Problem 2150 Fire Game Accept: 2702    Submit: 9240 Time Li ...

  9. 让 SyntaxHighlighter 3.x 支持 Lua 语法着色

    1. [代码]shBrushLua.js /** * SyntaxHighlighter * http://alexgorbatchev.com/SyntaxHighlighter * * Synta ...

  10. 每次rand出来都是41?说好的随机数呢?!

    rand()函数是C++标准函数库提供的随机数生成器,生成0-RAND_MAX之间的一个"伪随机"整数,理论上可以产生的最大数值为2^16-1,即32767. rand()函数不接 ...