javascript变量名提升
预解析的过程
代码的执行过程 程序在执行过程,会先将代码读取到内存中检查,会将所有的声明在此时进行标记。所谓的标记就是让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变量名提升的更多相关文章
- JavaScript 变量声明提升
JavaScript 变量声明提升 一.变量提升的部分只是变量的声明,赋值语句和可执行的代码逻辑还保持在原地不动 二.在基本的语句(或者说代码块)中(比如:if语句.for语句.while语句.swi ...
- JS高级. 05 词法作用域、变量名提升、作用域链、闭包
作用域 域,表示的是一个范围,作用域,就是作用范围. 作用域说明的是一个变量可以在什么地方被使用,什么地方不能被使用. 块级作用域 JavaScript中没有块级作用域 { var num = 123 ...
- Javascript变量名混淆细节
前言 UglifyJS会对JS文件的变量名进行混淆处理.要理解Javascript变量混淆的细节.我们须要回答下面几个问题: 1.遇到一个变量myName,我们怎么知道这个myName变量要不要混淆 ...
- javascript变量声明提升和函数声明提升
在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分. JS的解析过程分为两个阶段:预 ...
- 浅谈JavaScript变量声明提升
前段时间阿里实习生内推,一面就被刷了,也是郁闷.今天系统给发通知,大致意思就是内推环节不足以了解彼此,还可以参加笔试,于是赶紧再投一次.官网流程显示笔试时间3月31日,时间快到了,开始刷题.网上搜了一 ...
- JavaScript变量声明提升
JavaScript代码在被解析引擎执行前,会被“编译”把变量声明等放在合适的作用域中,如果不了解这一点,会让人产生很多疑惑. 文章:详解js变量声明提升
- javascript变量名命名规则
1. js变量名可以包含数字,字母,$及_,不能以数字开头. 2. js变量可以使用中文,但是最好不要这么命名,以避免不必要的麻烦.
- JavaScript变量名与函数名的命名规范
JavaScrip变量名与函数名的命名规范严格遵循以下5条: (1)首字符必须是字母.下划线.$,后跟任意的字母.数字.下划线.$ (2)严格区分大小写 (3)不能使用系统的关键字和保留字 (4)命名 ...
- javascript变量声明提升(hoisting)
javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 先看一段代码 1 2 3 4 5 var v = &quo ...
随机推荐
- hello
#include <iostream> int main() { std::cout << "请输入两个数字:" << std::endl; , ...
- buildroot 使用小记 - 2 源文件目录结构
官方下载下来的buildroot源码包在解压后,是一个名为buildroot的文件夹,它下面的目录/文件结构如下: Makefile - 顶级makefile,编译总入口 Config.in - 顶级 ...
- Adobe Dreamweaver(DW)
下载破解版地址:http://www.frontopen.com/1179.html 详情地址:http://baike.baidu.com/link?url=8Jv88BJ-wXeyABAbYEMl ...
- sendEmail的使用
坑!坑!坑!今天又弄了一天如何发送邮件,首先用sendmail,postfix.....等,都试过了,各种报错,然后就从早上弄到现在,在群里问问题的时候,一位好心的大哥说了他用的是sendEmail, ...
- SQL Server Profiler使用方法
一.SQL Server Profiler使用方法 1.单击开始--程序--Microsoft SQL Server 2005--性能工具--SQL Server Profiler,如下图: 2. ...
- 浏览器css bug及bug解决方法
Bugs及解决方案列表(以下实例默认运行环境都为Standard mode): 如何在IE6及更早浏览器中定义小高度的容器? 方法: #test{overflow:hidden;height:1px; ...
- IOS AFNetworking配置进IOS
Prefix Header 中填入绝对路径 //PCH 里面加入这个写代码 #ifndef TARGET_OS_IOS #pragma mark ---------- for AFNetwork st ...
- 实现关闭窗口IE不提示兼容火狐
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 第七次课:ssh的集成(SpringMV+Spring+Hibernate)
第一部分:程序结构 第二部分:配置 1.配置web.xml文件,启动spring和springMVC: 1)配置启动spring: <context-param> <param-na ...
- Linux查看当前目录下文件夹和文件的大小
File参数实际上是一个目录,就要报告该目录内的所有文件.如果没有提供 File参数,du命令使用当前目录内的文件. 如果File参数是一个目录,那么报告的块的数量就是分配到目录中文件以及分配到目录自 ...