js作用域相关知识

一、JavaScript 的执行分为两个步骤:
1、预解析(不是在执行代码)。 将所有的声明都加载到内存中,也就是:告诉解释器有什么东西了。
2、 一步一步的从上往下执行代码
预解析:变量提升 和 函数提升
var num = 123;
function fn() {};
提升之后的结果:
var num;
function fn() {}
代码从这一行开始执行

num = 123;

二、JavaScript的作用域
作用域:定义了一个变量之后,起作用的那块区域。
规则:要定义变量,就定义到当前作用域的最上面(推荐)
有两种作用域:
1、 块级作用域(JavaScript不支持这种作用域)
2、 词法作用域(JavaScript只支持这种作用域)
什么叫做词法作用域?
变量的作用范围, 在书写代码的时候就已经决定, 与运行时无关。
词法作用域,只需要查看 变量或者是函数声明的位置
在JavaScript中之后函数能够形成一个作用域


               函数内部可以访问到函数外部的变量,反之,不成立
var num = 123;
function f() {
var n = 999;
console.log(num);
}
f();
// 为什么在函数外部访问不到函数内部的变量?
// 函数形成了一个作用域,独立的环境,函数外部无法获取到的函数内部的数据。
console.log(n);
function fn() {
var n1 = 123;
function foo() {
var n2 = 456;
// bar的作用域链:
// bar自身 -> foo的作用域 -> fn的作用域 -> 全局作用域
function bar() {
var n3 = 789;
// 在这个位置,能访问到 n2?
}
bar();
}
foo();
}
fn();*/
三、作用域链规则
        1、将 script 标签看做一个整体 是全局作用域,这个作用域称为:0级别作用域。
        2、如果在script中声明了一个全局的函数,此时,全局函数的作用域级别为:1级别(只有函数才可以限定作用域)
        3、 ...以此类推, 直到 N级别
        4、 同级别的两个函数之间没有任何关系
5、 绘制作用域链的时候,只画出在当前作用域中定义的变量或者是函数。

注意点:

       ①链中的成员包括:在该链所属范围内 *声明* 的变量, 函数, 对象...    
       ②由于提升机制的存在,在开始的时候将 声明 都写在前面, 绘图的时候按照顺序绘制, 较为简单
       ③先绘制链中的成员,其他赋值操作,等到代码执行的时候再看。
       ④各链之间互不影响
四、变量的搜索原则:
1、按照作用域链中 从 高级别的链(一般是当前链) 向 低级别(n-1级,函数外部)的链中查找数据
2、如果找到 0级别 还是没有找到改变了,此时,就报错
3、查找的内容包括:当前作用域中定义的变量和参数






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值