作用域

局部函数

在javascript中,var定义变量实际是有作用域的。
假设在函数体中声明,则在函数体外不可以使用~(如果非要使用的话,可以用闭包

function qj() {var x = 1;x = x + 1;
}
x = x + 2;  // Uncaught ReferenceError: x is not defined

如果两个函数使用了相同的变量名,只要在函数内部,就不冲突

function qj() {var x = 1;x = x + 1;
}
function qj2() {var x = 'A';x = x + 1;
}

内部函数可以访问外部函数的成员,反之则不行

function qj() {var x = 1;console.log(x)// 内部函数可以访问外部函数的成员,反之则不行function qj2() {var y = x + 1;console.log(y)}qj2()var z = y + 1;console.log(z)
}


假设,内部函数变量和外部函数的变量,重名!

function qj() {var x = 1;function qj2() {var x = 'A';console.log('内 '+x)}qj2()console.log('外 '+x)}
qj()

假设在JavaScript中函数查找变量从自身函数开始~,由 “内” 向 “外” 查找,假设外部存在这个同名的函数,则内部函数会屏蔽外部函数的变量。


提升变量的作用域

function qj() {var x = 'X' + y;console.log(x)var y = 'y';
}

结果: Xundefined
说明:JavaScript执行引擎,自动提升了y的声明,但是不会提升变量y的赋值,等价于:

function qj() {var y;var x = 'X' + y;console.log(x)y = 'y';
}

这个是在JavaScript建立之初就存在的特性,养成规范:所有变量定义都放在函数的头部,不要乱放,便于代码维护;

function qj2() {var x = 1,y = x + 1,z,i,a;//undefined// 之后随意使用
}

全局函数

// 全局变量
x = 1;
function f() {console.log(x)
}
f()
console.log(x)

全局对象window

var x = 'xxx';
alert(x)
alert(window.x) // 默认所有的全局变量,都会自动绑定在Window对象下

alert()这个函数本身也是一个Window变量,使用window.alert()是一样的

var x = 'xxx';
window.alert(x)
var old_alert = window.alert;
window.alert = function () {}
// 发现alert()失效了
window.alert(123)
// 恢复
window.alert = old_alert
window.alert(456)

Javascript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错ReferenceError


规范
由于我们所有的全局变量都会绑定到我们的window上,如果不同的js文件,使用了相同的全局变量,就会冲突~ -->如何能够减少冲突?

// 唯一全局变量
var wangApp = {};// 定义全局变量
wangApp.name = 'wang';
wangApp.add = function (a,b) {console.log(a+b);return a+b;
}

把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题~


局部作用域let

function aa() {for (var i = 0; i < 100; i++) {console.log(i)}console.log(i+1); // 101 问题? i 出了这个作用域还能使用
}

ES6 let关键字,解决局部作用域冲突问题!

function aa() {for (let i = 0; i < 100; i++) {console.log(i)}console.log(i+1); // Uncaught ReferenceError: i is not defined
}

建议大家都使用let去定义局部作用域的变量。

常量 const

在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量;建议不要修改这样的值

var PI = '3.14';
console.log(PI)
PI = '132'; // 可以修改成功
console.log(PI)

在ES6引入了常量关键字const

const PI = '3.14';
console.log(PI)
PI = '132'; // Uncaught TypeError: Assignment to constant variable.
console.log(PI)

https://www.bilibili.com/video/BV1JJ41177di?p=13&spm_id_from=pageDriver

JavaScript-变量的作用域 、const、let相关推荐

  1. PHP (20140510)深入浅出 JavaScript 变量、作用域和内存 v 0.5

    深入浅出 JavaScript 变量.作用域和内存 v 0.5 本文主要从原理入手分享变量和作用域的相关知识,最后结合本文所分享知识,再次深入了解下闭包的运行原理. 主要参考<JS高级程序设计& ...

  2. Javascript变量、作用域与内存

    通过变量使用原始值与引用值 理解执行上下文 理解垃圾回收 ES规定,JS变量是松散类型的. 由于没有规定定义变量必须包含什么数据类型,变量的值和数据类型在脚本生命周期内可以改变. ES变量有2种不同类 ...

  3. 【javascript 变量和作用域】

    今天学习了javascript 的变量和作用域的基本知识,对于以前在开发中遇到的一些不懂的小问题也有了系统的认识,收获还是比较多的. [基本类型和引用类型] ECMAScript 变量可能包含两种不同 ...

  4. javaScript变量、作用域链

    变量 JavaScript 变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已. 变量分为基础类型值和引用类型值: 基本类型值指的是 简单的数据段(Undefined.Null.B ...

  5. JavaScript变量和作用域

    JavaScript有两种变量,全局变量和局部变量 如果在任何函数定义之外声明了一个变量,则该变量是全局变量,且该变量的值在整个持续范围内都可以访问和修改 如果在函数定义内声明来了一个变量,则该变量为 ...

  6. 第4章javascript变量、作用域和内存回收

    <!DOCTYPE html> <html><head><meta charset="UTF-8"><title>变量. ...

  7. JavaScript 变量的作用域和生命周期

    代码有生命吗?答案是有.它也像我们一样,拥有自己的生命.变量有局部变量和全局变量,它们的生命长短不一样.不过它的生命都是从它被声明的时候开始的,不同的是局部变量 会在函数运行以后被删除,也就是死亡,而 ...

  8. JavaScript变量不同作用域的测试

    source code: <html> <script> var x = 10; foo={x:20,bar: function() {var x = 30;return th ...

  9. 《JavaScript高级程序设计(第四版)》红宝书学习笔记(2)(第四章:变量、作用域与内存)

    个人对第四版红宝书的学习笔记.不适合小白阅读.这是part2.持续更新,其他章节笔记看我主页. (记 * 的表示是ES6新增的知识点,记 ` 表示包含新知识点) 第四章:变量.作用域与内存 4.1 原 ...

  10. JavaScript变量作用域如何像多个级别的政府一样

    by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) JavaScript变量作用域如何像多个级别的政府一样 (How JavaScript variable sco ...

最新文章

  1. 美法加三位科学家获2018诺贝尔物理学奖
  2. Vsphere 6.0
  3. LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)
  4. Python os.makedirs try 以及 raise
  5. Ubuntu下安装配置VIM/GVIM(GUI-Vim)
  6. linux虚拟机备份树莓派,为树莓派做系统备份镜像(for Linux #038; Mac),
  7. 第二个冲刺期的第四天
  8. 抛弃jQuery 深入原生的JavaScript
  9. python安装whl文件的注意事项(windows系统)
  10. php对象在内存中的分配
  11. 《电路》邱关源 思维导图 第二章 电阻电路的等效变换
  12. android关闭硬件动画加速器,Android中的硬件加速
  13. 埃拉托色尼筛法(素数筛)
  14. MPLS LDP基础
  15. hdu 4287 sdnu 1119 Intelligent IME
  16. 概率论的几种常考分布总结
  17. AAA认证——IE阶段
  18. 网易服务器维护,网易15日未停服维护,所有服务器正常运行中
  19. Linux中安装亚马逊OpenJDK11
  20. BZOJ4244 邮戳拉力赛 dp

热门文章

  1. Mysql for linux 安装
  2. Nexus协议,闲鱼一体化开发的幕后玩家
  3. 看!闲鱼又开源了一个 Flutter 开发利器
  4. Andrew Ng教你如何引领公司进入AI时代
  5. 支撑双十一的网络引擎:飞天洛神
  6. 阿里云ET工业大脑发布AI视觉产品“见远”:电池片、车辆、路面都能被“诊断”
  7. 从边缘到云,万物互联时代Aruba的技术经
  8. Gartner最新报告:阿里云计算、存储、网络、安全均获得最高分
  9. 如何用Chrome读懂网站监测Cookie
  10. 2020 年最厉害的 10 门编程语言