在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. 关于Java中强制类型转换的问题

    为了更好的理解我们先看下面的例子: package com.yonyou.test; import java.util.ArrayList; import java.util.Iterator; im ...

  2. Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can&#39;t find referenced class问题的解决方式

    Warning: can't find superclass or interface Warning: can't find referenced class 这两个问题的解决方法: 1.要把你项目 ...

  3. java之static变量与全局、局部变量的区别

    static变量与全局.局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式.这两者在存储方式上并无 ...

  4. iOS文件的管理(添加,删除,拷贝,移动)

    #import "ViewController.h" @implementation ViewController - (void)viewDidLoad { [super vie ...

  5. 疯狂Java学习笔记(77)-----------凝视注意事项

    代码凝视,能够说是比代码本身更重要.这里有一些方法能够确保你写在代码中的凝视是友好的: 不要反复阅读者已经知道的内容 能明白说明代码是做什么的凝视对我们是没有帮助的. // If the color ...

  6. iOS开发 - App程序启动原理

    Info.plist和pch文件的作用 建立一个project后,会在Supporting files目录下看到一个"project名-Info.plist"的文件,该文件对pro ...

  7. Jquery-easyui的默认图标的使用,以及如何添加自己想要的图标

    easyui的默认图标有以下这些: .icon-blank{ background:url('icons/blank.gif') no-repeat; } .icon-add{ background: ...

  8. Erlang Garbage Collector

    Erlang Garbage Collector | Erlang Solution blog https://www.erlang-solutions.com/blog/erlang-garbage ...

  9. 使用tencent协议发起临时会话

    调用默认浏览器打开链接tencent://message/?uin=QQ即可发起临时会话参数uin为目标QQ Java示例 import java.awt.Desktop; import java.n ...

  10. JSP JDBC 读取SQL Server 数据2

    <%-- Created by IntelliJ IDEA. User: hellohongfu Date: 2017/12/21 Time: 0:16 To change this templ ...