摘要:变量作用域详解作用域规则大部分情况下没有块级作用域除非你使用当你使用的情况下仅仅支持函数作用域不使用声明的变量为全局变量不用情况下中局部变量只能通过和函数参数声明大部分情况下没有块级作用域除非你使用与很多语言不同在之前并没有块级作用域一个作
Javascript变量作用域详解 JS作用域规则
JS大部分情况下没有块级作用域, 除非你使用let
当你使用var的情况下, JS仅仅支持函数作用域
不使用var, let声明的变量为全局变量
不用let情况下, JS中局部变量只能通过var和函数参数声明
1. JS大部分情况下没有块级作用域, 除非你使用let与很多语言不同, JS在ES6之前并没有块级作用域:
function test() { // 一个作用域 for(var i = 0; i < 10; i++) { // 不是一个作用域 // count } console.log(i); // 10 for(let j = 0; j < 10; j++) { // 是一个独立作用域 // count } console.log(j); // j is not defined }
本例中i并不只存在于for循环的区域中而是存在于整个test函数中. 如果我们用let声明变量i, i则拥有了块级作用域
2. 在你使用var的情况下, JS仅仅支持函数作用域刚才讲了在ES6之前JS没有块级作用域, 那有什么作用域呢? 答案是函数作用域.
function test() { var a = "hello" } test() console.log(a) // a is not defined
本例中在函数内部声明的变量a的作用域仅限于函数内部, 所以在函数外部我们不能访问到.
3. 不使用var, let声明的变量为全局变量如果我们把上面的例子中的var去掉会发生什么呢?
function test() { a = "hello" } test() console.log(a) // hello4. 不用let情况下, JS中局部变量只能通过var和函数参数声明
由上面的分析我们知道, 函数内部声明的变量的作用域为函数内也就是属于局部变量.
//Exp1: 典型错例 for (var i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); }, 1000); } // 10 10 10... //Exp2: 利用setTimeout函数传入参数 for (var i = 0; i < 10; i++){ setTimeout(function(i){ console.log(i); }, 1000, i); } // 1 2 3 4 ... //Exp3: 利用bind传入函数参数 for (var i = 0; i < 10; i++){ setTimeout(function(i){ console.log(i); }.bind(null, i), 1000); } // 1 2 3 4 ... //Exp4: 利用闭包的性质传入参数 var cb = function(i) { return function() { console.log(i) } } for (var i = 0; i < 10; i++){ setTimeout(cb(i), 1000); } // 1 2 3 4 ...
后三个例子看似无关联其实原理是一致的: 把变量当作函数参数传入函数, 这样变量就在函数中有了局部作用域而非全局作用域.
当然, 这其实是JS设计上的缺陷, 在ES6时代我们只需要通过let创建拥有快级作用域的变量就可以轻松解决上述问题了.
//Exp5: 利用let创建块级作用域参数 for (let i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); }, 1000); } // 1 2 3...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/88059.html
摘要:而闭包的神奇之处正是可以阻止这件事情的发生。事实上内部作用域依然存在,因此没有被回收频繁使用闭包可能导致内存泄漏。拜所声明的位置所赐,它拥有涵盖内部作用域的闭包,使得该作用域能够一直存活,以供在之后任何时间进行引用。 作用域 作用域(scope),程序设计概念,通常来说,一段程序代码中所用到的变量并不总是有效/可用的,而限定这个变量的可用性的代码范围就是这个变量的作用域。通俗一点就是我...
摘要:不同的是函数体并不会再被提升至函数作用域头部,而仅会被提升到块级作用域头部避免全局变量在计算机编程中,全局变量指的是在所有作用域中都能访问的变量。 ES6 变量作用域与提升:变量的生命周期详解从属于笔者的现代 JavaScript 开发:语法基础与实践技巧系列文章。本文详细讨论了 JavaScript 中作用域、执行上下文、不同作用域下变量提升与函数提升的表现、顶层对象以及如何避免创建...
摘要:不是引用类型,无法输出简而言之,堆内存存放引用值,栈内存存放固定类型值。变量的查询在变量的查询中,访问局部变量要比全局变量来得快,因此不需要向上搜索作用域链。 赞助我以写出更好的文章,give me a cup of coffee? 2017最新最全前端面试题 基本类型值有:undefined,NUll,Boolean,Number和String,这些类型分别在内存中占有固定的大小空...
阅读 2901·2021-11-24 09:39
阅读 3481·2021-11-22 13:54
阅读 3395·2021-11-16 11:45
阅读 2417·2021-09-09 09:33
阅读 3166·2019-08-30 15:55
阅读 1263·2019-08-29 15:40
阅读 906·2019-08-29 15:19
阅读 3372·2019-08-29 15:14