函数提升与变量提升常见面试题
函数提升与变量提升
在JavaScript中,变量的定义和函数的定义都会被提升,而且函数的声明优先于变量的声明;在变量中,变量的赋值不会被提升,只是声明被提升了,但是函数的声明有点不一样,如果是函数式声明则函数体也会被一同提升,如果是var式的声明,怎么提升声明,不会提升函数体。
例子1:
var a=3;function b(){if(a){var a=1;}else{var a=0;}console.log(a);}b();//控制台输出:0;此时输出的a是b函数里面的私有变量。
例子2:
function b(){var a;if(a){a=1;}else{a=0;}console.log(a);}var a;a=3;b();//控制台输出:0;此时输出的a是b函数里面的私有变量。
例子3:
var a=1;function b(){a=10;return;function a(){};}b();console.log(a);//控制台输出:1;此时输出的a是全局变量。
例子4:
function b(){function a(){};//函数提升,声明局部函数a;a=10;//将函数a强制进行类型转换为number,并赋值为10;此时的a是局部变量;return; }var a;a=1; b();//函数b的返回结果为undefined,因为在函数体里面,没有return任何东西; console.log(a);//控制台输出:1;此时输出的a是全局变量。
例子5:
a();//控制台报错,因为被提升的只是a的声明,而赋值的函数体却没有没提升,所以报错信息显示a不是一个函数;b();//控制台输出this is b funciton! ;函数b可以被提升;var a=function(){console.log('this is a function!');}function b(){console.log('this is b function!');}
例子6:
function b(){console.log('this is b function!');} var a;a();//控制台报错,因为被提升的只是a的声明,而赋值的函数体却没有没提升,所以报错信息显示a不是一个函数;b();//控制台输出this is b funciton! ;函数b可以被提升;a=function(){console.log('this is a function!');}
对于全局作用域范围的变量,var与没有var是有区别的,没有var的写法,其变量不会被提升。eval里面的变量也不会被提升;
例子
console.log(a);//控制台报错,a未定义;a变量没有被提升;a=1;console.log(b);//控制台输出undefined;b未赋值;b变量得到提升;var b=1;
function b(){console.log(a);//控制台输出undefined;a声明得到提升;var a=10; }function d(){console.log(c);//控制台报错,变量c没有定义;c声明没有得到提升;eval("var c=10");}b();d();
函数提升与变量提升常见面试题相关推荐
- Javascript中函数提升和变量提升
词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active ...
- 数据分析(SQL)常见面试题:开窗函数
一.什么是开窗函数 开窗函数/分析函数:over() 开窗函数也叫分析函数,有两类:一类是聚合开窗函数,一类是排序开窗函数. 开窗函数的调用格式为: 函数名(列名) OVER(parti ...
- js函数提升和变量提升_关于在js中提升的真相
js函数提升和变量提升 Earlier this week I was preparing to give a tech talk about some foundational JavaScript ...
- python 分类变量xgboost_XGBoost 原理 及 常见面试题
目录 预备知识:CART树 XGBoost思想 XGBoost目标函数 如何学习第 棵树 基于泰勒公式展开推导目标函数 寻找最佳树 结点分裂与停止生长 寻找最佳分裂点 对比GBDT 常见面试题 预备知 ...
- java类型转换面试题_JavaSE:数据类型之间的转换(附常见面试题)
数据类型之间的转换 分为以下几种情况: 1)低级到高级的自动类型转换: 2)高级到低级的强制类型转换(会导致溢出或丢失精度): 3)基本类型向类类型转换: 4)基本类型向字符串的转换: 5)类类型向字 ...
- MySQL数据库常见面试题总结
1.数据库的常用范式: 第一范式(1NF):指表的列不可再分,数据库中表的每一列都是不可分割的基本数据项,同一列中不能有多个值: 第二范式(2NF):在 1NF 的基础上,还包含两部分的内容:一是表必 ...
- web前端常见面试题
Vue面试题 生命周期函数面试题 1.什么是 vue 生命周期 2.vue生命周期的作用是什么 3.第一次页面加载会触发哪几个钩子 4.简述每个周期具体适合哪些场景 5.created和mounted ...
- iOS常见面试题总结
1.objective-c常见面试题: 1.OC 语言的基本特点 OC 语言是 C 语言的一个超集,只是在 C 的基础之上加上了面向对象(oop) 的特性; OC 与 Java 语言相同都是单继承,这 ...
- 前端常见面试题及答案
文章转自http://www.cnblogs.com/syfwhu/p/4434132.html 前言 本文是在GitHub上看到一个大牛总结的前端常见面试题,很多问题问的都很好,很经典.很有代表性. ...
最新文章
- 计算机应用基础课程建设规划,计算机应用基础课程建设方案(6页)-原创力文档...
- 一步一步实现自己的模拟控件(6)——控件树及控件区域
- IIS,apche,nginx,301域名重定向设置
- python题库刷题训练软件_Python基础练习100题 ( 11~ 20)
- Centos 系统添加/删除用户和用户组
- php条件运算符加法器,【加法笔记系列】JS 加法器模拟
- 【luogu4185】 [USACO18JAN]MooTube [并查集]
- 在Idea中连接数据库并生成实体类(mybatis逆向生成实体类)
- 如何用Vegas制作故障特效
- Java基础12 implement和extends的区别
- 数字孪生|成熟度评价
- 【没有刀剑,如何行走江湖】半晌私语(上)
- 在线apt-get安装mysql_apt-get安装mysql
- 根据体重和身高获取BMI值
- visual studio 中鼠标光标的切换(或鼠标光标变成阴影方块)
- 程序员的数学——傅里叶变换
- 分布式-Java应用
- 面试题:进程间通信的方式
- meanshift 与 camshift 跟踪算法比较
- vue鼠标右键自定义菜单_使用Vue自定义指令实现右键菜单