预解析的过程
代码的执行过程 程序在执行过程,会先将代码读取到内存中检查,会将所有的声明在此时进行标记。所谓的标记就是让js解释器直到有这个名字,后面在使用名字的时候,不会出现未定义的错误,这个标记就是提升 声明:
名字的声明,标识符的声明(变量名的提升)
名字的声明就是让我的解释器知道有这个名字
名字没有任何数据与之对应
函数的声明
函数声明包含两部分
首先告诉解释器函数的名字
告诉解释器 这个名字对应的函数体是什么
函数声明与函数表达式有区别,函数声明是单独写在一个结构中,不存在任何语句,逻辑判断等结构中 函数声明: function(){} function f(){}
函数表达式:
var f=function(){};
this.sayHello=function(){};
if(true){
function f(){}
}
代码分析:

案例1:
var num=1;
function num(){
alert(num);
}
num();
预解析过程
提升声明 变量num
再提升函数 num在内存中已经存在,因此直接绑定对应的函数体
内存中有一个函数num
执行代码
给num赋值为1,覆盖函数
调用num 由于num中存储的是数字1 因此报错
案例2:
var num=123;
function foo1(){
console.log(num);
var num=456;
console.log(num);
}
foo1();
代码分析:

预解析过程
提升变量名num和函数foo1
执行代码
给num赋值为123
调用函数
进入函数的瞬间预解析,提升变量名num
在函数内部是一个独立的空间,允许使用外部的变量即num覆盖外面的num
执行第一句 输出为Undefined
执行第二句 给num赋值为456
执行第三句 输出为456
案例3:
if(true){
function f1(){
console.log('true');
}
}else{
function f1(){
console.log('false');
}
}
f1();
代码分析:

预解析过程
函数在判断语句中为表达式所以不提升
执行代码
执行if语句,条件成立,输出true
但是一些老版本在执行过程中,会把If语句中的函数表达式当成函数声明来解析, 并提升函数输出为false*

javascript变量名提升的更多相关文章

  1. JavaScript 变量声明提升

    JavaScript 变量声明提升 一.变量提升的部分只是变量的声明,赋值语句和可执行的代码逻辑还保持在原地不动 二.在基本的语句(或者说代码块)中(比如:if语句.for语句.while语句.swi ...

  2. JS高级. 05 词法作用域、变量名提升、作用域链、闭包

    作用域 域,表示的是一个范围,作用域,就是作用范围. 作用域说明的是一个变量可以在什么地方被使用,什么地方不能被使用. 块级作用域 JavaScript中没有块级作用域 { var num = 123 ...

  3. Javascript变量名混淆细节

    前言 UglifyJS会对JS文件的变量名进行混淆处理.要理解Javascript变量混淆的细节.我们须要回答下面几个问题: 1.遇到一个变量myName,我们怎么知道这个myName变量要不要混淆 ...

  4. javascript变量声明提升和函数声明提升

    在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分. JS的解析过程分为两个阶段:预 ...

  5. 浅谈JavaScript变量声明提升

    前段时间阿里实习生内推,一面就被刷了,也是郁闷.今天系统给发通知,大致意思就是内推环节不足以了解彼此,还可以参加笔试,于是赶紧再投一次.官网流程显示笔试时间3月31日,时间快到了,开始刷题.网上搜了一 ...

  6. JavaScript变量声明提升

    JavaScript代码在被解析引擎执行前,会被“编译”把变量声明等放在合适的作用域中,如果不了解这一点,会让人产生很多疑惑. 文章:详解js变量声明提升

  7. javascript变量名命名规则

    1. js变量名可以包含数字,字母,$及_,不能以数字开头. 2. js变量可以使用中文,但是最好不要这么命名,以避免不必要的麻烦.

  8. JavaScript变量名与函数名的命名规范

    JavaScrip变量名与函数名的命名规范严格遵循以下5条: (1)首字符必须是字母.下划线.$,后跟任意的字母.数字.下划线.$ (2)严格区分大小写 (3)不能使用系统的关键字和保留字 (4)命名 ...

  9. javascript变量声明提升(hoisting)

    javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 先看一段代码 1 2 3 4 5 var v = &quo ...

随机推荐

  1. enum 枚举的使用

    在程序当中,我们经常定义一些常量来标识一些状态,类型等. 比如 定义订单的状态,可以定义为ORDER_STATUS_CANCEL = 1 表示订单状态为"订单已取消". 但是感觉定 ...

  2. 一款好用的杀毒软件-pchunter64

    360真是猛,用system权限运行了一坨后台进程.今天清理系统盘想删掉360发现根本没权限.进程又杀不掉. 最后使用 pchuter64 强行干掉了360 避免了 重装系统的尴尬.360作为世界第一 ...

  3. 打开div层

    $('#moneyWin').dialog('open').dialog('center').dialog('setTitle', '用户充值');

  4. setAttribute()和getAttibute(),getParameter()

    request.setAttribute("key",value)方法给主键设置一个值, request.getAttribute("key")方法从上述设置的 ...

  5. php session的存放目录,再次回顾

    session的存放位置可以通过运行时配置ini_set和函数session_save_path来设置 .session_save_path - 读取/设置当前会话的保存路径 string sessi ...

  6. 使用 IntraWeb (44) - 测试读取 SqLite (三)

    使用数据连接池(TIWDataModulePool). 新建工程时勾选 Pool Data Connections: 新增的 Pool(TIWDataModulePool) 被放在 ServerCon ...

  7. 加密算法—MD5、RSA、DES

    最近因为要做一个加密的功能,简单了解了一下加密算法,现在比较常用的有三个加密算法MD5加密算法.RSA加密算法.DES加密算法.       MD5加密算法     定义:MD5算法是将任意长度的“字 ...

  8. iOS10适配及Xcode8配置

    一.证书管理 用Xcode8打开工程后,比较明显的就是下图了,这个是苹果的新特性,可以帮助我们自动管理证书.建议大家勾选这个Automatically manage signing(Ps.但是在bea ...

  9. Java签名

    有的时候会忘记签名,想想还是在博客里面记录下,,省的我忘了还要去翻文档,哈哈: 除了boolean, long,类型其他的基本类型都是首字母大写: Java类型 类型描述符 boolean  Z ch ...

  10. 20145225《Java程序设计》 第4周学习总结

    20145225<Java程序设计> 第4周学习总结 教材学习内容总结 第六章 继承与多态 6.1继承 继承共同行为:存在着重复,可把相同的程序代码提升(pull up)为父类.exten ...