JS变量提升和作用域
一.JS变量提升
1.当浏览器引擎解析js代码时,将js中的所有一开始就是var声明的和function声明的都提升到全局。此时又叫全局作用域
console.log(aa);
console.log(ff);
console.log(bb); var aa = "aa"; function ff(){
console.log("ff");
}

注意:undefined和is not defined是不一样的。
undefined:声明了该变量但是调用时没有定义值
is not defined:没有声明也没有定义值
2.对于函数也一样,又叫做局部作用域
function ff(){
console.log(aa);
console.log(fun);
console.log(bb);
var aa = "aa";
function fun(){}
}
ff();

3.作用域分类
全局作用域
函数作用域
块作用域(ES6才有)
注:查找作用域先从当前作用域查找再找上层作用域
例1:
var x = 10;
function fn() {
console.log(x);
}
function show(f) {
var x = 20;
f();
}
show(fn); //10
分析:
- 全局作用域
- var x
- function fn
- function show
- 函数作用域fn
- 函数作用域show
- var x
注意此处两个函数作用域是同一级的
执行到console.log(x)时,会先看fn()的函数作用域内是否有x变量没有就出去看全局的(由于show和fn为同一级所以不会看show),则此时x = 10;
例2:
var fn = function () {
console.log(fn)
}
fn()
var obj = {
fn2: function () {
console.log(fn2)
}
}
obj.fn2()

分析:
- 全局作用域:
- var fn
- var obj
- 全局中无函数作用域
第一个fn():会执行console.log(fn)在函数中没有fn,找全局发现fn变量是一个函数则返回函数
第二个obj.fn2():会执行console.log(fn2)在函数中没有发现fn2,不回去找obj对象中的fn2由于没有对象作用域这个东西,则找全局也没有找到报错了。
如果稍微修改以下将fn2改为this.fn2则不会报错,绑定调用对象obj然后调用obj的fn2。
var fn = function () {
console.log(fn)
}
fn()
var obj = {
fn2: function () {
console.log(this.fn2)
}
}
obj.fn2()

4.上下文栈
由于和其他语言的压栈方式相同则不在赘述
JS变量提升和作用域的更多相关文章
- JS 变量提升与函数提升
JS 变量提升与函数提升 JS变量提升 变量提升是指:使用var声明变量时,JS会将变量提升到所处作用域的顶部.举个简单的例子: 示例1 console.log(foo); // undefined ...
- js变量提升与函数提升的详细过程
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- js 变量提升+方法提升
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- js变量提升的坑
关于js变量提升 变量提升 在js函数内部是可以直接修改全局的变量的,个人感觉是不好的设计, 但是确实存在这个概念 原理: 先查看有没有函数变量bb 查看形参有没有bb 查看全局有没有bb 报错, 找 ...
- JS中的函数声明和函数表达式的区别,即function(){}和var function(){},以及变量提升、作用域和作用域链
一.前言 Uncaught TypeError: ... is not a function function max(){}表示函数声明,可以放在代码的任何位置,也可以在任何地方成功调用: var ...
- 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 ...
随机推荐
- 『2019Summer Algorithms』
一个暑假两次集训,感觉学了好多好多的东西,也挖了好多好多的坑,于是就决定写一篇关于算法的总结,用于熟悉新算法,也留下一点对新算法的理解. AC自动机 简单的说就是在\(trie\)树上实现\(KMP\ ...
- Java之路---Day12(多态)
2019-10-26-22:40:09 目录: 1.多态的概念 2.多态的分类 3.实现多态的三个必要条件 4.多态的格式 5.多态成员变量的使用特点 6.多态成员方法的使用特点 7.多态的好处 8. ...
- 阿里熔断限流Sentinel研究
1. 阿里熔断限流Sentinel研究 1.1. 功能特点 丰富的应用场景:例如秒杀(即突发流量控制在系统容量可以承受的范围).消息削峰填谷.集群流量控制.实时熔断下游不可用应用等 完备的实时监控:S ...
- CSS 案例
一.滑动门案例 二.小黄人案例 三.圣杯布局&双飞翼布局
- 渗透 Facebook 的思路与发现
0x00 写在故事之前 身一位渗透测试人员,比起 Client Side 的弱点,我更喜欢 Server Side 的攻击,能够直接控制服务器并获得权限操作 SHELL 才爽 . 当然一次完美的渗透出 ...
- Jmeter场景设置与监听
目录 Jmeter场景设置 场景运行 Jmeter测试监控 Samples:取样器运行次数(提交了多少笔业务). Jmeter场景设置 场景的概念: 场景是用来尽量真实模拟用户操作的工作单元,场景设计 ...
- Linux系统密码复杂度安全配置
密码有效期控制 在文件/etc/login.defs中进行设置,如下参数 PASS_MAX_DAYS 180 #密码最长过期天数 PASS_MIN_DAYS 30 #密码最小过期天数 PASS_MIN ...
- 【前端_js】array.forEach和$.each()及$().each()的用法与区别
1.$.each():方法是jQuery中的方法,用于遍历数组或对象.用法:$.each(array,function(index,value){...}),有两个参数,第一个为待遍历的数组或对象,第 ...
- 使用Kubeadm安装Kubernetes【单Master节点】
参考:Kubernetes官方文档 Kubernetes安装方案选择 Centos 7 配置科学上网 安装Calico网络插件 kubernetes-dashboard部署 Kubernetes ...
- 网络文件系统-NFS
1. 什么是NFS NFS是 Network File System 的缩写,即网络文件系统.一种使用于分散式文件系统的协议,有Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的 ...