js变量提升总结
JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。
例1
var name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })();
在自运行函数内,存在var name = 'jack'
,所以name会提升到当前作用域最前边,所以 name为undefined。当程序运行到变量的时候,会先在当前作用域内查找该变量,如果找不到,则会向父级作用域查找,如果还是找不到,就会报错
例2
var x = 1; // Initialize x console.log(x + " " + y); // '1 undefined' var y = 2; 相当于: var x = 1; // Initialize x var y; // Declare y console.log(x + " " + y); // '1 undefined' y = 2; // Initialize y
例3
(function(){ a = 4; console.log(a); console.log(window.a); var a = 3; console.log(a); })() 输出 4 undefined 3
变量提升到当前作用域,window作用域内没有定义a,所以undefined
例4 变量与函数提升
console.log(foo); function foo(){}; var foo = '12'; console.log(foo); 输出 ƒ foo(){} 和 12; console.log(foo); var foo = function(){}; var foo = '12'; 输出 undefined
原来函数提升分为两种情况:
一种:函数申明。就是上面A,function foo(){}这种形式
另一种:函数表达式。就是上面B,var foo=function(){}这种形式
第二种形式其实就是var变量的声明定义,因此上面的B输出结果为undefined应该就能理解了。
而第一种函数申明的形式,在提升的时候,会被整个提升上去,包括函数定义的部分
例5
var sayHello; console.log(typeof (sayHey));//=>function console.log(typeof (sayHo));//=>undefined if (true) { function sayHey() { console.log("sayHey"); } sayHello = function sayHo() { console.log("sayHello"); } } else { function sayHey() { console.log("sayHey2"); } sayHello = function sayHo() { console.log("sayHello2"); } } sayHey();// => sayHey2 sayHello();// => sayHello
函数声明整体提升,js解析从上到下,提升sayHey
,接着提升下面的sayHey
,把第一个覆盖了,所以执行sayHey()输出sayHey2
函数表达式不会整体提升,所以输出sayHello
例6
function aa(a,b,c) { console.log(a); console.log(aa); console.log(arguments); var a = function(){ console.log(12); }; var aa = '444'; arguments = 6; console.log(a); console.log(aa); console.log(arguments); function a(){}; } aa(1,2,3); VM2311:3 ƒ a(){} VM2311:4 undefined VM2311:5 Arguments(3) [ƒ, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ] VM2311:11 ƒ (){ console.log(12); } VM2311:12 444 VM2311:13 6 undefined var num1 = 1; function fn(num3){ var num4; console.log(num1); //output undefined console.log(num3); //output 4 console.log(num4); //throw error “num4 is not defined” console.log(num2); //throw error “num2 is not defined” var num1 = num4 = 2; num2 = 3; var num3= 5; } fn(4);
例7
window.val = 1; var obj = { val: 2, dbl: function () { this.val *= 2; val *= 2; console.log(val); console.log(this.val); } }; // 说出下面的输出结果 obj.dbl(); var func = obj.dbl; func(); 2\4\8\8
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一次性集中处理大量数据的定时任务,如何缩短执行时间?
作者:58沈剑 问题抽象:(1)用户会员系统;(2)用户会有分数流水,每个月要做一次分数统计,对不同分数等级的会员做不同业务处理;数据假设: (1)假设用户在100w级别;(2)假设用户日均1条流水,也就是说日增流水数据量在100W级别,月新增流水在3kW级别,3个月流水数据量在亿级别;常见解决方案:用一个定时任务,每个月的第一天计算一次。 //(1)查询出所有用户 uids[] = select uid from t_user; //(2)遍历每个用户 foreach $uid in uids[]{ //(3)查询用户3个月内分数流水 scores[]= select score from t_flow where uid=$uid and time=[3个月内]; //(4)遍历分数流水 foreach $score in scores[]{ //(5)计算总分数 sum+= $score; } //(6)根据分数做业务处理 switch(sum) 升级降级,发优惠券,发奖励; } 一个月执行一次的定时任务,会存在什么问题?计算量很大,处理的数据量很大,耗时很久,按照水友的说法,需...
- 下一篇
SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件
一、Mybatis框架 1、mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 2、mybatis特点 1)sql语句与代码分离,存放于xml配置文件中,方便管理 2)用逻辑标签控制动态SQL的拼接,灵活方便 3)查询的结果集与java对象自动映射 4)编写原生态SQL,接近JDBC 5)简单的持久化框架,框架不臃肿简单易学 3、适用场景 MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。对性能的要求很高,或者需求变化较多的项目,MyBatis将是不错的选择。 二、与SpringBoot2.0整合 1、项目结构图 采用druid连接池,该连接池。 2、核心依赖 <!-- mybatis依赖 --> <dependency> <...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Mario游戏-低调大师作品
- 2048小游戏-低调大师作品
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程