JavaScript-StepPitGuide
  • 封面
  • 前言
  • 基础知识
    • 基础知识
      • 变量声明
      • 变量类型和计算
      • 作用域
      • 基本数据类型
        • Undefined
        • Null
        • Boolean
        • Number
        • String
        • Symbol
      • 类型转换
    • 引用类型
      • Object类型
      • Array类型
        • 检测数组
        • 转换方法
        • 栈方法
        • 队列方法
        • 重排序方法
        • 操作方法
        • 位置方法
        • 迭代方法
        • 归并方法
      • Date类型
      • RexExp类型
      • Function类型
      • Set类型(ES6)
      • Map类型(ES6)
    • BOM
      • window对象
      • location对象
      • navigator对象
      • screen对象
      • history对象
    • DOM
      • DOM节点操作
      • DOM结构操作
    • 事件
      • 事件流
      • 事件注册与触发
      • 事件对象
      • 事件分类
    • 异步
      • Ajax
      • Promise
    • 正则表达式
    • 面向对象程序设计
      • 构造函数
      • 原型链
      • 继承
      • New
      • Object.create
    • 函数表达式与函数式编程
      • 递归
      • 闭包
      • this
      • 箭头函数
      • 高阶函数
      • 由函数构建函数
      • 纯度、不变性和更改政策
      • 基于流的编程
      • 无类编程
      • 函数基本应用
    • 语法规则
      • ESlint
  • 进阶知识
    • 算法应用
      • 基本排序算法
        • 冒泡排序
        • 选择排序
        • 插入排序
        • 希尔排序
        • 归并排序
        • 快速排序
    • 模块化
      • AMD
      • CommonJS
      • ES6模块化
    • 应用
      • Socket.io库
      • async+await异步调用
      • axios
    • 设计模式
    • 性能优化
    • 工具
      • 时间操作
    • 异常监控
    • 安全🔐
      • XSS
      • CSRF
    • 跨域
      • 跨域
      • 跨域方法
        • Hash
        • JSONP
        • CORS
        • XDomainRequest
由 GitBook 提供支持
在本页
  • 作用域
  • 变量作用域
  • JS变量作用域
  • 作用域链

这有帮助吗?

  1. 基础知识
  2. 基础知识

作用域

作用域

执行上下文

console.log(a);  // undefined
var a = 100;

fn('zhangsan')  // 'zhangsan' 20
function fn(name) {
  age = 20;
  console.log(name, age);
  var age;
}
  • 范围:一段<script>或者一个函数

  • 全局:变量定义、函数声明

  • 函数:变量定义、函数声明、this、arguments

  • 注意⚠️“函数声明”和“函数表达式”的区别

fn()
function fn() {
  //声明
}

fn1()
var fn1 = function () {
  //表示
}
var a = 100; //类似于这个

//全局声明

console.log(a);
var a = 100;

fn('zhangsan')
function fn(name) {
  console.log(this);
  age = 20;
  console.log(name,age);
  var age;

  bar(100);

  function bar(num) {
    console.log(num);
  }
}

作用域

  • 没有块级作用域

  • 只有函数和全局作用域

//无块级作用域
if(true){
  var name = 'zhangsan';
}
console.log(name);

//函数和全局作用域
var a = 100;
function fn() {
  var a = 200;
  console.log('fn',a);
}
console.log('global',a);
fn();

如何理解作用域

  • 自由变量

  • 作用域链,即自由变量的查找

  • 闭包的两个场景

var x=10;
function foo() {
  alert(x);
}
function bar() {
  var x=20;
  foo();
}
bar();
  • 生命周期

  • 作用范围

变量作用域

  • 静态作用域

  • 动态作用域

静态作用域

  • 被称为词法作用域

  • 由程序定义位置决定

var x=10;
function foo() {
  alert(x);
}
function bar() {
  var x=20;
  foo();
}
bar();

全局作用域

x

10

foo

bar

foo作用域

-

-

bar作用域

x

20

动态作用域

  • 程序运行时刻

  • 栈操作

x:20

bar:

foo:

JS变量作用域

  • JS使用静态作用域

  • JS没有块级作用域(全局作用域、函数作用域)(ES5)

  • ES5中使用词法环境管理静态作用域

var x = 10;
function foo() {
  var z = 30;
  function bar(q) {
    return x + y + q;
  }
  return bar;
}
var bar = foo(20);
bar(40);
  • 环境记录

    • 形式参数

    • 函数声明

    • 变量

  • 对外部词法环境的引用(outer)

  • 初始化

  • 执行

作用域链

var a = 100;
function fn() {
  var b = 200;

  //作用域没有定义变量,即“自由变量”
  console.log(a);
  console.log(b);
}
fn();

var a = 100;
function F1() {
  var b = 200;
  function F2() {
    var c = 300;
    console.log(a);//a是自由变量。形成一个链式结构,向父级去查找
    console.log(b);//b是自由变量
    console.log(c);//
  }
}

对变量提升的理解

  • 变量定义

  • 函数声明(注意和函数表达式的区别)

创建10个<a>标签 点击的时候弹出来对应的序号

  • 错误写法

//这是一个错误的写法!!!
var i,a;
for (var i = 0; i < 10; i++) {
  a = document.createElement('a');
  a.innerHTML = i + '<br>';
  a.addEventListener('click',function (e) {
    e.preventDefault();
    alert(i)
  })
  document.body.appendChild(a);
}
//输出为如下: <a>"9"<br></a>
  • 正确写法

//这是一个正确写法!!!
var i;
for (i = 0; i < 10; i++) {
  (function(i){
    var a = document.createElement('a');
    a.innerHTML = i + '<br>';
    a.addEventListener('click',function (e) {
      e.preventDefault();
      alert(i);
    })
    document.body.appendChild(a);
  })(i)
}
上一页变量类型和计算下一页基本数据类型

最后更新于4年前

这有帮助吗?