JavaScript基础知识介绍——作用域(静态作用域、全局作用域、IIFE、函数作用域和提升、严格模式)

作用域决定了变量、常量和参数被定义的时间和位置

当某个变量的作用域是一个给定的函数时,必须要记住:形参只有在函数被调用的时候才存在(编程实参)。一个函数可能会被调用多次:每次函数调用开始时,参数才是真实存在的,在函数返回后参数就失去作用域了

变量和常量也只有在创建后才存在。也就是说,在使用let或const声明之前,他们是没有作用域的(var是特例)

作用域(或者可见性):指的是当前可见并且可以被正在执行的代码块(称作执行上下文)访问的标识符

在JavaScript中,作用域是静态的,这意味着只能通过阅读源代码就能确定变量的作用域

静态作用域:

静态作用域:在某个作用域内定义了某个函数(而不是调用函数),该作用域包含所有变量也在该函数的作用域内

在JavaScript中,静态作用域适用于全局作用域、块作用域、以及函数作用域

全局作用域:

在全局作用域中生命的一切,在当前程序的作用域的所有作用域内都是可用的

在全局作用域中声明的变量叫全局变量(谨慎地使用)——努力避免依赖全局作用域

块作用域:

let和const关键字声明的变量名处在块作用域中

块作用域指的是那些仅仅在代码块内有效的变量

console.log('before block');
{
    console.log('inside block');
    const x = 3;             //打印3
    console.log(x);
}
console.log('outside block; x=${x}');   //ReferenceError: x未定义

解析:这里有一个独立的块:块通常是控制流语句的一部分,例如if或for,但定义独立的块也是合法的。在块内定义了变量x,一旦出了此块,x就不在作用域内,就会被认为是未定义的

变量屏蔽:

变量屏蔽有时候也叫做变量阴影(即一个相同名字的变量会将外部作用域的变量屏蔽起来)

作用域的层次结构:可以在原有的作用域中进入一个新的作用域。此时会建立一个作用域链来决定哪些变量在作用域中:当前作用域链中的所有变量都在作用域内,并且(只要它们没有被屏蔽)都是可以被访问的

即时调用函数表达式:

函数表达式允许创建即时调用函数表达式(IIFE),IIFE声明了一个函数,并立即执行该函数

(function() {   //使用函数表达式创建了一个匿名函数,然后立即调用该函数
    //这里为IIFE代码
})();

IIFE好处:任何内部信息都有自己的作用域,并且因为它本身就是函数,他还可以向作用域外传递信息

比较常见的返回值有数组、对象,以及函数(可以打印出自己被调用的次数,而且次数不会被篡改)

函数作用域和提升:

使用let声明变量,变量只在声明之后才存在。而使用var声明,变量在当前作用域中任意地方都可用,甚至可以在声明前使用

PS:未声明的变量和值为undefined的变量不是同一个概念。使用未声明的变量会报错,但可以安全使用语句存在且值为undefined的变量

//使用let时,如果引用的变量未声明,将会得到一个错误
x;            //ReferenceError:x未定义
let x = 3;   //永远不会执行——因为错误终止了程序

//而用var声明的变量,可以在声明前被引用
x;             //undefined
var x = 3;
x;             //3

原因:var声明的变量采用了提升机制,JavaScript会扫描整个作用域(函数或者全局作用域),任何使用var声明的变量都会被提升至作用域的顶部

使用var声明的变量,JavaScript不会关心它是否有重复声明

函数提升:

类似于var声明的变量,函数声明也会被提升至它们作用域的顶部,这允许在函数声明之前调用

严格模式:

严格模式:阻止隐式全局变量

在开始编写代码之前,单独插入一行字符串"use strict"(单引号或双引号都可以)就可以启动严格模式

为了避免麻烦,可将所有代码封装宰割立即执行的函数中:

(function() {
   'use strict';
    //所有代码从这里开始...代码会按照严格模式执行
})();

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值