编辑
2023-03-22
JavaScript
0
请注意,本文编写于 576 天前,最后修改于 555 天前,其中某些信息可能已经过时。

目录

作用域
概念
分类
说明
全局变量
局部变量
注意点
JavaScript 变量生命周期
作用域链
说明
闭包
闭包的概念
闭包的作用
闭包的缺点

作用域

概念

指可以访问的变量的集合,也可以认为一个变量的可用范围

分类

  • 全局作用域
    函数外,全局不能访问局部的数据
  • 局部作用域
    函数内, 局部内可以访问全局的数据

说明

在JavaScript中,使用var创建的变量是具有作用域的

全局变量

局部变量

在JavaScript函数中声明的变量,会成为函数的局部变量

注意点

注意js执行顺序从上而下

JS中对于未声明的变量a(包括函数内变量)直接赋值,则会自动在全局声明,若全局有变量a则此时函数调用会修改全局变量a的值,若函数内部有var变量则考虑变量提升,此时直接赋值则修改局部变量a

javascript
var a = 14; function fn() { a = 13; //调用fn()函数,这一步函数内并没有声明//变量a,js自动全局声明变量a,再执行修改//全局变量a的值为13 } fn(); console.log(a); // 输出结果为: // 13

函数不调用不执行,局部变量在函数开始执行时创建,函数执行完后局部变量会自动销毁

函数调用时传入形参,会自动在函数内声明

局部变量只在函数作用域内生效,所以不同函数中变量名可以相同

全局无法访问局部,局部可以访问全局,两个单独的局部无法相互访问

JavaScript的函数在查找变量时从自身函数开始,内部变量没有声明时则从“内”向“外”查找,内部定义了则用内部的,内部没有则有外部定义的

JavaScript 变量生命周期

JavaScript 变量生命周期在它声明时初始化
局部变量在函数执行完毕后销毁
全局变量在页面关闭后销毁

作用域链

说明

查找变量的过程称之为作用域链
从自身作用域逐渐向上查找,找到则停止查找;若直到外部全局作用域都未找到则报错

闭包

闭包的概念

指有权访问另一个函数作用域中的变量的函数

闭包的作用

避免全局作用域污染
即将只需使用一两次的变量使用闭包的方式存放在函数中便能避免污染全局作用域

闭包的缺点

  • 闭包将函数的活动对象维持在内存中,过度使用闭包会导致内存占用过多;

  • 闭包只能取得外部函数中任何变量的最后一个值,在使用循环且返回的函数中带有循环变量时会得到错误结果;

function createFunction() { var result = new Array(); for (var i = 0; i < 10; i++) { result[i] = function() { return x } } return result; } var funcArray = createFunction(); for (let func of funcArray) { console.log(func()) } //运行结果为10,因为result[i]直接保存的是一个匿名函数,当调用匿名函数时循环已经结束,此时i的值为10
  • 当返回的函数为匿名函数时,注意匿名函数中的this指的是window对象。

本文作者:RKLS

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!