浅谈js中的var和function变量提升,var声明变量提升,块级作用域中的函数提升
1.首先最常见的一种变量提升
console.log(a); //输出 undefinedvar a=10;console.log(a) // 输出 10
var 有提升的作用其实上面的代码会变成会变成
var a;console.log(a); //输出 undefineda=10; //赋值留在原地console.log(a) // 输出 10
2.if语句中的 var
var a=5;if(a==5){ // if语句没有 语句块的作用 所以没有闭包的作用 这里的a是console.log(a); //输出5var a=3; //再 if语句中声明的变量 也是一个全局变量 所以这个a=3 会把前面的 5覆盖console.log(a); //输出3}console.log(a); //输出3
3.function的提升
var a;function a(){console.log(123)};a(); //输出 123 再js中函数是第一公民 会比var声明的的变量更靠前 var a;function a(){console.log(123)};function a(){console.log(456)}a(); //输出 456 再js中函数是第一公民 后面的 a函数把前面的
覆盖 js只会存在一个同名变量 函数声明的变量是以一个地址的形式存储在内存中 同时 js中如果已经存在 一个同名的变量且已经赋值 在重新定义的没有赋值的变量 就会跳过初始化阶段
function a(){console.log(123)};function a(){console.log(456)}var a=10;a(); //输入引用错误 a不是一个函数 这个时候又定义了一个a变量 会把前面同名的函数给覆盖掉 js是弱数据类型 这个时候 a就变成了一个number类型 所以 报出了 a不是一个函数
4.function 和 var 的 一起使用
var b=10;function a(){ //函数具有局部作用域的效果 所以内部和外面的全局作用不通 console.log(b); //输出undefinedvar b=8; console.log(b); //输出 8}a(); //记住函数只有调用才有用 别忘了调用console.log(b); //输出 10
5.if语句
if (!("a" in window)) {var a = 1;};alert(a);上面的语句相当于var a;if (!("a" in window)) { //判断 a是否在全局变量中 如果不再则会将 a赋值 1 大家记住在 if语句中 var声明的变量 也是一个全局a = 1; // 变量 ,而并不会 在一这个条件是否成立 js在执行程序之前 会首先把在全局中用var 声明的变量提前};alert(a); // 弹出 undefined
6.练习 下面这个难度有点大 是一个es6的闭包的知识 答案我就不公布 闭包作用就是利用了函数作用域和外部不通的原理防止全局污染
var name="world";(function(){console.log(name)if(typeof name==="undefined"){var name="jack";console.log("goodbye "+name)}else{console.log("hello "+name)}}())
7. 还有一种特殊情况 感兴趣的童鞋可以去了解下哈 就是 es6新增的块级作用域 中的 函数提升
var a = 100;{a = 10;function a() {}a = 20;
}console.log(a)
块级作用域中的函数提升 类似于 var 但是 和var 又不全一样
块级作用域中的函数提升 只是提升到 块级作用域的顶部 但 并不是立即映射到全局 这个也是为啥那个全局中的a发生了变化 当这个声明语句走完 才正式在块级作用域中生效
关注我 持续更新 前端知识
浅谈js中的var和function变量提升,var声明变量提升,块级作用域中的函数提升相关推荐
- ES6中块级作用域下的函数声明
背景 因为ES5的时候没有块级作用域,所以ES5规定不能再if这样的块中声明函数,但是为了兼容各大浏览器并没有严格遵守这条规定. ES6的时候引入了块级作用域,规定在块级作用域中声明函数就相当于使用l ...
- js模仿块级作用域(js没有块级作用域私有作用域)
js模仿块级作用域(js没有块级作用域私有作用域) 一.总结 1.js没有块级作用域:在for循环中定义的i,出了for循环还是有这个i变量 2.js可以模拟块级作用域:用立即执行的匿名函数:(匿名函 ...
- let、const和var的区别(涉及块级作用域)
let .const和var的区别 let.const.var在js中都是用于声明变量的,在没有进行ES6的学习前,我基本只会使用到var关键字进行变量的声明,但在了解了ES6之后就涉及到了块级作用域 ...
- 详解var、let、const关键词声明变量的区别,以及变量提升、块级作用域的认识等。
首先回顾一下JavaScript中var声明变量的基础知识: • 在使用var关键词声明变量时,变量在函数外则是全局变量,有全局作用域,全局变量在页面关闭后销毁:变量在函数内则是局部变量,作用局部作用 ...
- 你真的懂switch吗?聊聊switch语句中的块级作用域
最近在代码中不小心不规范的,在switch里面定义了块级变量,导致页面在某些浏览器中出错,本文讨论以下switch语句中的块级作用域. switch语句中的块级作用域 switch语句中的块级作用 ...
- c语言switch的作用域,你真的懂switch吗?聊聊switch语句中的块级作用域
最近在代码中不小心不规范的,在switch里面定义了块级变量,导致页面在某些浏览器中出错,本文讨论以下switch语句中的块级作用域. switch语句中的块级作用域 switch语句中的块级作用域可 ...
- 浅谈JS中常见的问题(三)
往期文章目录 浅谈JS中常见的问题(一) 浅谈JS中常见的问题(二) JS知识总结 往期文章目录 前言 11. 同步和异步的区别 12. JS 判断变量类型的几种方法 13. 如何阻止事件冒泡与默认事 ...
- php字面量,浅谈js之字面量、对象字面量的访问、关键字in的用法
一:字面量含义 字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量. 字面量分为字符串字面量(string literal ).数组字面量(array literal) ...
- 浅谈 js 数字格式类型
原文:浅谈 js 数字格式类型 很多人也许只知道 123,123.456,0xff 之类的数字格式. 其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有 ...
最新文章
- IE兼容问题IE6,IE7,IE8,IE9,IE10
- 在开课吧学python的经历-28岁,年薪30万,工作5年,被裁掉只用了5分钟
- 共享卫士2.0版设置说明
- QLocalServer和QLocalSocket单进程和进程通信
- 运行效果演示-修改applcation-db.xml 文件
- WinCE中中断的处理过程(驱动开发人员角度)
- 如何把VS Code打造成Java开发IDE?
- [代码阅读] ECS toString实现方法
- golang中文文档_【译】Go 语言源码贡献官方指导文档
- 【职业生涯】这样的开发人员每个团队都想要
- 用babel cli编译用ES6写的JSX
- 告别抠图!海量免抠PNG,任你选
- android 灰色向白色渐变,iPhone-iOS的白色到透明渐变层为灰色
- primefaces教程_Primefaces仪表板组件示例教程
- robo 3t使用教程
- 小心 transmittable-thread-local 的这个坑
- oracle判断除数为零,Oracle decode函数 除数为零
- 全网疯传!最新高频100题汇总(附答案详解)
- 英语作文计算机的利弊,电脑游戏的坏处英语作文
- react中input输入框显示字数