一言难尽的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 ...
随机推荐
- C# 实现身份验证之WCF篇(1)
WCF身份验证一般常见的方式有:自定义用户名及密码验证.X509证书验证.ASP.NET成员资格(membership)验证.SOAP Header验证.Windows集成验证.WCF身份验证服务(A ...
- mysql加速source导入数据
mysql加速source导入数据 # 进入mysql中执行如下 ; ; ; ; -- 你的sql语句1 -- 你的sql语句2 -- 你的sql语句3 ; ; ; ;
- 记一次给自己的本子更换一个SSD盘
记一次给自己的本子更换一个SSD盘 关于笔记本电脑:特别讨厌联想的本子(个人习惯:键盘超级硬-按着手疼)dell的可以考虑一下,不过如果我推荐的话:小米的本子还是可以考虑一下的一般买的话建议买6000 ...
- 使用Linux搭建FTP服务器实现文件共享
使用Linux搭建FTP服务器实现文件共享... ---------------- Linux中的文件共享:FTPVSFTPDVSFTPD虚拟用户 FTP可以用在Linux与Linux 和Window ...
- kafka常见异常汇总
1>.java.lang.OutOfMemoryError:Map failed 发生上述问题,原因是发生OOM啦,会导致kafka进程直接崩溃掉!因此我们只能重新启动broker节点了,但 ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- Javaweb学习笔记——(九)——————Servlet的进入,及ServletConfig、GenericServlet、HttpServlet、ServletContext、获取类路径资源
Servlet1.什么是Servlet? *Servlet是Javaweb三大组件之一(Servlet,Filter,Listener) *Servlet是用来处理客户端请求的动态资源 *Servle ...
- 百度地图web api使用案例
效果如下: 1.获取位置的经纬度: 如坐标:114.110033,22.541098 获取经纬度: http://api.map.baidu.com/lbsapi/getpoint/index.htm ...
- oracle 存储过程(包)的写法和执行
--in 代表输入参数,out 代表输出参数create or replace procedure myproc(id in int, v_message out varchar2) is--定义临时 ...
- 第26月第13天 hibernate导包
1. https://yq.aliyun.com/ziliao/386827