JS变量(声明)提升和函数声明提升
目录
一、概念理解
1.变量声明提升
2.函数声明提升(又叫函数提升)
变量提升和函数提升的优先级
小结:
一、概念理解
变量提升:在当前作用于中,js代码自上而下执行之前,浏览器会把所有带var/function关键字进行提前声明或定义。带var的关键字只是提前声明一下,带function的关键字在变量提升阶段把定义和声明都完成了。
1.变量声明提升
通过 var 定义(声明)的变量,在定义语句之前就可以访问到
值:undefined,只是当时的值是undefined
2.函数声明提升(又叫函数提升)
通过 function 声明的函数,在声明语句之前就可以直接调用
值:函数定义(对象)
js中创建函数有两种方式:函数声明式和函数字面量式(又叫函数表达式、匿名函数)。只有函数声明才存在函数提升!如:
关于函数声明的方式可参考函数声明以及调用的方式
console.log(f1); // function f1() {} console.log(f2); // undefined function f1() {} // 函数声明式var f2 = function() {} // 函数字面量式
只所以会有以上的打印结果,是由于js中的函数提升导致代码实际上是按照以下来执行的:
function f1() {} // 函数提升,整个代码块提升到文件的最开始console.log(f1); console.log(f2);var f2 = function() {}
console.log(global); // undefinedvar global = 'global';console.log(global); // globalfunction fn () {console.log(a); // undefinedvar = 'abc';console.log(a); // abc}fn();var global; // 变量提升,全局作用域范围内,此时只是声明,并没有赋值console.log(global); // undefinedglobal = 'global'; // 此时才赋值console.log(global); // 打印出globalfunction fn () {var a; // 变量提升,函数作用域范围内console.log(a);a = 'abc';console.log(a);}fn();
变量提升和函数提升的优先级
在函数与变量之间,函数首先会被提升,然后才是变量。
console.log(xy) //function xy(){console.log('hello')}var xy;
var z = 'def'function xy (){
console.log(z) //undefined
var z = 'abc';
console.log(z) //abc
}
xy();
函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖。
console.log(xy) //function xy(){console.log('hello')}var xy = 5;var z = 'def'function xy (){console.log(z) //undefinedvar z = 'abc'; console.log(z) //abc} xy(); // 报错Uncaught TypeError: xy is not a function 因为被变量赋值覆盖了
函数内部变量提升优先级高于函数外部变量提升(这里还涉及到作用域的问题)
var z = 'def'function xy (){console.log(z) //undefinedvar z = 'abc'; console.log(z) //abc} xy();---------------------------------------------------------var z = 'def'function xy (){console.log(z) // def// var z = 'abc'; console.log(z) //def} xy();
小结:
函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖。
在js中变量和函数的声明会提升到最顶部执行
函数的提升高于变量的提升
函数内部如果用 var 声明了相同名称的外部变量,函数将不再向上寻找。
匿名函数不会提升。
JS变量(声明)提升和函数声明提升相关推荐
- JavaScript 中的 Hoisting (变量提升和函数声明提升)
如何将 函数声明 / 变量 "移动" 到作用域的顶部. 术语 Hoisting(提升) 在很多 JavaScript 博文中被用来解释标识符的解析.其实 Hoisting(提升) ...
- js中变量名提升和函数名提升
首先,js中变量没有块级作用域,但是有函数作用域,即只有函数可以约数变量的作用域. 并且,函数的实质也是一个变量,所以可以改变它的值,即赋值.所以变量名提升和函数名提升非常相像. 1.变量名的提升发生 ...
- c语言常用的格式声明,c语言函数声明格式是什么
c语言函数声明格式是什么 c语言函数声明格式是"函数类型 函数名称(参数列表);".在函数声明中的参数列表中,不需要给出具体的变量名称,但必须给出每个变量的类型. 函数声明,不是说 ...
- Js 变量声明提升和函数声明提升
Js代码分为两个阶段:编译阶段和执行阶段 Js代码的编译阶段会找到所有的声明,并用合适的作用域将它们关联起来,这是词法作用域的核心内容 包括变量声明(var a)和函数声明(function a(){ ...
- python是什么语言、即变量不需要显示声明数据类型-Python函数声明以及与其他编程语言数据类型的比较...
** 1.函数声明 ** 与其它大多数语言一样 Python 有函数,但是它没有像 C++ 一样的独立的头文件:或者像 Pascal 一样的分离的 interface / implementation ...
- 函数声明和变量声明提升
var a; // 声明一个变量,标识符为a function a() { // 声明一个函数,标示符也为a } alert(typeof a); 显示的是"function",即 ...
- js中立即执行函数会预编译吗_js变量提升和函数提升
把变量提升函数提升拿出来讲,一看就知道是老前端搬砖工了,其实这些js的基础本质的东西,很有必要去了解,可以活跃思维,而且可以在研究这个的过程中,找到当初设计这门语言的人的想法,然后让自己不仅仅是对这个 ...
- JS变量提升和函数提升的顺序
1.变量的提升: 变量名会提升到 '当前作用域' 顶部,此时该变量为undefined,未赋值,赋值是在js原位置. console.log(a); // undefined var a = 10 c ...
- JavaScript函数声明提升
首先,JavaScript中函数有两种创建方式,即函数声明.函数表达式两种. 1.函数声明. function boo(){console.log(123); } boo() 2.函数表达式. var ...
最新文章
- BZOJ3782 上学路线 【dp + Lucas + CRT】
- 2014 Super Training #7 F Power of Fibonacci --数学+逆元+快速幂
- How to make a proposal?
- 遇到tensorflow has no attribute 问题
- RabbitMQ之呕心沥血的总结(图文并茂、万字级别、毕生所学)
- EV3 直接命令 - 第 5 课 从 EV3 的传感器读取数据
- 日志汇总:logging、logger
- PAT乙类1007之素数对猜想
- Linux服务器iops性能测试-fio
- 怎样安装ubuntu系统
- 除了国内红海拼刀,移动 App 在海外能否挖到新机会?
- E: Sub-process /usr/bin/dpkg returned an error code (1)
- B00015 C++实现的图类
- 【语音识别】基于matlab DWT算法0~9数字语音识别【含Matlab源码 1726期】
- 【高登世德:为资产证券化引入区块链技术】GBCAX
- 华为天才少年年薪201万,作息时间表曝光:所有的逆袭,都是蓄谋已久
- 一键轻松设置项目代理
- python职能-python运维工程师主要干什么
- 实习生招聘--CVTE笔试【1】
- css !important用法以及CSS样式使用优先级判断
热门文章
- 三月桃花开,用python给你带来你的桃花运,详细解析画一棵表白树!
- 简述HTTP请求过程
- C++面向对象程序设计:编写重载函数Max1(或使用函数模板)分别求取两个整数,三个整数,两个双精度,三个双精度数的最大值。
- Python使用numpy与pandas计算数组元素的变化率
- 测绘资质涉密证-地理信息安全在线培训考试系统注意事项
- 永恒之柱2显示服务器,永恒之柱2游戏黑屏是什么原因怎么解决_画面显示不全解决方法教程攻略...
- 7-3 随意组合dfs
- jquery所有版本下载地址
- 毕业设计-微信小程序商城
- 为什么魂系列的叙事如此迷人?