一言难尽的js变量提升
基础知识
在这个课题开始之前我们先做一些基础知识的讲解
1、在顶级的区域内声明的变量为 window级别的变量。 也就是说var a=100 等价于 window.a=100;
2、局部的重新声明变量没有意义。var a=100;var a;后面的将没有意义。
3、在有参数函数的定义中 function abc(p1){} abc(1),在函数执行中,先构建,在执行,会有两个步骤,所以说当函数执行之前构建过程中,将临时生成代码 var p1=1;将来一切不赋值的声明将变得没有意义。
var p1;//没有意义
var p1=2;//有意义。
开始进入正题
全局作用域和局部作用域
全局作用域:整个JS执行环境
局部作用域:通过创建一个函数就开辟出了一个局部作用域
全局变量和 局部变量
全局变量:在全局作用域都可以访问的变量
局部变量:只能在当前局部作用域访问的
变量声明提升:
如果变量声明在函数里面,则将变量声明提升到函数的开头
如果变量声明是一个全局变量,则将变量声明提升到全局作用域的开头
变量运行(搜索)机制:
首先看,有没有局部作用域
如果有,查找是不是这个局部作用域定义的变量
如果不是,寻找上一级作用域,直到找到全局作用域
如果全局作用域也找不到这个变量,这个变量就是未定义的 undefined
第一题:
var a=1;
function test(){
console.log(a);
var a=1;
}
test();
根据变量声明提升和变量搜索机制,函数test()应为
function test(){
    var a;
    console.log(a);//此时由于a并咩有被赋值,所以也就是undefined
        a=1;
}
第二题:
var b=2;
function test2(){
window.b=3;
console.log(b);//值为3
}
test2();
任何通过附加在window上的变量都相当于声明一个全局变量,或者是给全局变量赋值
第三题:
c=5;
function test3(){
window.c=3;
console.log(c);
var c;
console.log(window.c);
}
test3();
根据变量声明提升和变量搜索机制:
c=5;//声明一个全局变量c
function test3(){
var c;//变量声明提升,声明一个局部变量
window.c=3;//改变全局变量c的值
console.log(c);//由于此时的c是一个局部变量c,并且没有被赋值 c就是undefined
console.log(window.c);//此时的c就是一个全局变量c,也就是值为3
}
test3();
一言难尽的js变量提升的更多相关文章
- js 变量提升+方法提升
		<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ... 
- JS 变量提升与函数提升
		JS 变量提升与函数提升 JS变量提升 变量提升是指:使用var声明变量时,JS会将变量提升到所处作用域的顶部.举个简单的例子: 示例1 console.log(foo); // undefined ... 
- js变量提升与函数提升的详细过程
		大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ... 
- JS变量提升和作用域
		一.JS变量提升 1.当浏览器引擎解析js代码时,将js中的所有一开始就是var声明的和function声明的都提升到全局.此时又叫全局作用域 console.log(aa); console.log ... 
- js变量提升的坑
		关于js变量提升 变量提升 在js函数内部是可以直接修改全局的变量的,个人感觉是不好的设计, 但是确实存在这个概念 原理: 先查看有没有函数变量bb 查看形参有没有bb 查看全局有没有bb 报错, 找 ... 
- js 变量提升和函数提升原理
		关于js的变量,开始的时候我们都会被告知,变量声明应该在引用该变量之前.关于为什么要这样做呢,开始的时候本着会用就行的目的,也没去深究.不过后来经常会发现一些让人很费解的..姑且称为现象吧.先看一段代 ... 
- 关于JS变量提升的一些坑
		function log(str) { // 本篇文章所有的打印都将调用此方法 console.log(str); } 函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部 变量声明.命名 ... 
- JS 变量提升
		var a = 1; function foo() { console.log(a); var a = 2; } foo(); //undefined 根据变量提升机制,最后得出undefined; ... 
- js变量提升与函数提升
		在es6之前,js语言并没有块级作用域,即{}形成的作用域,只有全局作用域和函数作用域,所谓的提升,即是将该变量的声明或者函数的声明提升,举个例子 console.log(global); //und ... 
随机推荐
- 列举一些 MacBook Pro 必需的外设和应用程序推荐
			来源:知乎 文章收录于:风云社区SCOEE,提供上千款mac软件下载 基于从事Apps设计或开发者,使用 MacBook Pro,以下罗列一些必需的外设和应用程序推荐. Retina 256GB SS ... 
- 使用property为类中的数据添加行为
			对于面向对象编程特别重要的是,关注行为和数据的分离. 在这之前,先来讨论一些“坏”的面向对象理论,这些都告诉我们绝不要直接访问属性(如Java): class Color: def __init__( ... 
- Maven 命令参数 整理
			命令参数 备注 mvn -v --version 显示版本信息; mvn -V --show-version 显示版本信息后继续执行Maven其他目标; mvn -h --help 显示帮助信息; m ... 
- SQL语法基础之DROP语句
			SQL语法基础之DROP语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看DROP帮助信息 mysql> ? DROP Many help items for yo ... 
- Hbase学习01
			1.1 快速介绍 1.1.1 快速入门,单节点Hbase 本小节介绍单节点独立HBase的设置. 独立实例包含所有HBase守护进程 - Master,RegionServers和ZooKeeper ... 
- Idea中的一些快捷键
			最常用快捷键 sout 输出语句 psvm 输出main方法 fori 输出for语句 iter 输出foreach语句 Ctrl+Shift+U 大小写转换 Ctrl+Shift+Enter 补全一 ... 
- 2、JPA-Annotation
			注解放在类属性上不生效时可放在get方法上试试,原因未知 @Entity /** * @Entity 该Java类为实体类,将映射到数据库表.如声明一个实体类 Customer,它将映射到数据库中的 ... 
- 1、JPA-HelloWorld
			/** * JPA 是 hibernate 的一个抽象(就像JDBC和JDBC驱动的关系) * JPA 本质上是一种 ORM 规范,不是 ORM 框架,因为 JPA 并未提供 ORM 实现,只是制订了 ... 
- NPOI使用教程附Helper
			1 NPOI简介 1.1 NPOI是什么 NPOI是POI的.NET版本,POI是一套用Java写成的库,我们在开发中经常用到导入导出表格.文档的情况,NPOI能够帮助我们在没有安装微软Office的 ... 
- jenkins检查代码,如没更新停止构建步骤
			需求分析 在jenkins中没有找到构建前插件,每次构建时间很长,希望可以实现判断代码是否更新,如果没更细则停止构建步骤. 实现步骤 在构建时执行shell命令,而jenkins提供的的环境变量可以实 ... 
