作用域是什么?如何理解作用域。(日常笔记)

18 篇文章 0 订阅
1 篇文章 0 订阅

理解作用域

作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对 变量进行赋值,那么就会使用 LHS 查询;如果目的是获取变量的值,就会使用 RHS 查询。

把作用域链比喻成一个建筑

在这里插入图片描述
这个建筑代表程序中的嵌套作用域链。第一层楼代表当前的执行作用域,也就是你所处的 位置。建筑的顶层代表全局作用域。

词法作用域

词法作用域意味着作用域是由书写代码时函数声明的位置来决定的。编译的词法分析阶段 基本能够知道全部标识符在哪里以及是如何声明的,从而能够预测在执行过程中如何对它 们进行查找。

例子:

function foo(a) {
   var b = a * 2;
	function bar(c) { 
	   console.log( a, b, c ); 
	}
	bar( b * 3 ); 
}
foo( 2 ); // 2, 4, 12
  • 包含着整个全局作用域,其中只有一个标识符:foo。
  • 包含着 foo 所创建的作用域,其中有三个标识符:a、bar 和 b。 包含着
  • bar 所创建的作用域,其中只有一个标识符:c。

函数作用域

在任意代码片段外部添加包装函数,可以将内部的变量和函数定义“隐 藏”起来,外部作用域无法访问包装函数内部的任何内容。

        var a = 2;

        function foo() { 
            var a = 3;
            console.log(a); // 3 
        } 
        foo();
        console.log(a); // 2

虽然这种技术可以解决一些问题,但是它并不理想,因为会导致一些额外的问题。首先, 必须声明一个具名函数 foo(),意味着 foo 这个名称本身“污染”了所在作用域(在这个 例子中是全局作用域)。其次,必须显式地通过函数名(foo())调用这个函数才能运行其 中的代码。

        var a = 2;
        (function foo() {
            var a = 3;
            console.log(a); // 3 
        })();
        console.log(a); // 2

区分函数声明和表达式最简单的方法是看 function 关键字出现在声明中的位 置(不仅仅是一行代码,而是整个声明中的位置)。如果 function 是声明中 的第一个词,那么就是一个函数声明,否则就是一个函数表达式。

匿名和具名

函数表达式:

setTimeout( function() { console.log("I waited 1 second!"); }, 1000 );

这种叫做:匿名函数表达式

立即执行函数表达式
        var a = 2;
        (function IIFE(global) {
            var a = 3;
            console.log(a); // 3 
            console.log(global.a); // 2 
        })(window);
        console.log(a); // 2

由于函数被包含在一对 ( ) 括号内部,因此成为了一个表达式,通过在末尾加上另外一个 ( ) 可以立即执行这个函数,比如 (function foo(){ … })()。第一个 ( ) 将函数变成表 达式,第二个 ( ) 执行了这个函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值