ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

90、JS作用域和作用域链

2021-08-03 09:02:34  阅读:173  来源: 互联网

标签:函数 作用域 JS 对象 查找 scope 90 变量


转自:https://blog.csdn.net/jbj6568839z/article/details/106618708

一、作用域的定义

(1)作用域:

  1. 一段程序代码中所用到的名字并不总是有效,而限定它的可用性范围就是这个名字的作用域;
  2. 确定当前执行代码对变量的访问权限;

(2)全局变量:任何地方都能访问到的对象拥有全局作用域

  1. 函数外定义的变量
  2. 所有末定义直接赋值的变量自动声明为拥有全局作用域

(3)局部变量:只能在函数中访问,该函数外不可访问

  1. 定义在函数中的变量

 二·、作用域链

(1) 当查找变量的时候都发生了什么?(什么是作用域链)

  1. 会先从当前上下文的变量对象中查找;
  2. 如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找;
  3. 一直找到全局上下文的变量对象,也就是全局对象
  4. 作用域链的顶端就是全局对象

这样由多个执行上下文的变量对象构成的链表就叫做作用域链,从某种意义上很类似原型和原型链。

(2) 作用域链和原型继承查找时的区别:

  • 查找一个普通对象的属性,但是在当前对象和其原型中都找不到时,会返回undefined
  • 查找的属性在作用域链中不存在的话就会抛出ReferenceError

(3) 作用域嵌套

既然每一个函数就可以形成一个作用域(词法作用域 || 块级作用域),那么当然也会存在多个作用域嵌套的情况,他们遵循这样的查询规则:

  • 内部作用域有权访问外部作用域;
  • 外部作用域无法访问内部作用域;(真是是这样吗?)
  • 兄弟作用域不可互相访问;

在《你不知道的Js》中,希望读者可以将作用域的嵌套和作用域链想象成这样:
å¨è¿éæå¥å¾çæè¿°

 (4)作用链举例

两段代码的结果都是"local scope",书中的回答是:JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的嵌套的函数 f() 定义在这个作用域链里,其中的变量 scope 一定是局部变量,不管何时何地执行函数 f(),这种绑定在执行 f() 时依然有效。

var scope = "global scope";
function checkscope1(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f(); // 注意
}
checkscope1();
var scope = "global scope";
function checkscope2(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope2()();

标签:函数,作用域,JS,对象,查找,scope,90,变量
来源: https://blog.csdn.net/sunnnnh/article/details/119341959

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有