JavaScript作用域

JS作用域+this指向 【JavaScript js作用域 this指向及关于this指向的面试题 箭头函数和普通函数的this指向区别 阅读详情

作用域

        作用域通常用来限制变量/函数的使用范围并规定JS引擎如何去寻找所要使用的变量

例如: 

var name = '悟空';

function fn(){
    var name = '八戒';
    console.log(name,'函数内部访问name');
}

fn();

console.log(name,'函数外部访问name');

        如果不对变量的使用范围进行限制,那么在上面程序执行时,打印的结果应该分别是什么?如何保证程序的执行结果是我们想要的结果?这就是为什么要创建作用域

        作用域会像一个盒子一样保存在其中定义的变量/函数,当JS引擎需要使用某个变量/函数,会优先在当前作用中进行寻找,如果当前作用域中不存在所需的变量/函数时,JS引擎会向外层作用域寻找该变量/函数

        但是这又出现了一个问题,如何确定外层作用域是哪一个作用域,作用域之间的关系是如何确定的?

作用域有两种工作模型

        词法作用域模型与动态作用域模型,JavaScript采用的模式为词法作用域模型,后面会简单称呼为词法作用域,动态作用域

        作用域的工作模型,简单的理解就是用来如何确定作用域与作用域之间的关系的

        一、词法作用域

        词法作用域是指在程序处于词法分析阶段时创建的作用域,通过这种方式使得作用域与作用域的关系是静态的不可变的(在不使用其他方式的情况下),也就是作用域之间的关系是由作用域创建的位置来决定

例如:

var name = '悟空';

function $A(){
  console.log(name,'==> A函数打印');
}

function $B(){
  var name = '八戒';
  $A();
}

$B();

// 结果: 悟空 ==> A函数打印

此时通过如果使用在控制台打印window并且查看$A函数的[[scopes]]这个内部属性,其内部作用域链如下图

要注意的是内部属性数组的第0位应该是$A函数的自己的作用域,第1位才应该是全局作用域,但是谷歌的控制台并没有进行展示(我也不知道为什么)

这就是词法作用域,每个作用域之间的关系在代码编写时就被定义了,所以词法作用域也可以称为静态作用域

        注:

        如果你想知道$B函数的作用域可以尝试打印$B.prototype查看其构造函数中的[[scopes]]内部属性

        二、动态作用域

        动态作用域就是在作用域被使用到的内一刻才会确定该作用域与其他作用域直接的关系(因为JS是使用的是词法作用域,是无法进行展示的,只能进行大概的表示)

var name = '悟空';

function $A(){
  console.log(name,'==> A函数打印');
}

function $B(){
  var name = '八戒';
  $A();
}

$B();

// 结果: 八戒 ==> A函数打印

        注意如果是动态作用域此时的打印结果应为 八戒 ==> A函数打印,如果使用词法作用域进行表示大概流程应该是如下图

var name = '悟空';

function $B(){
  var name = '八戒';

  function $A(){
    console.log(name,'==> A函数打印');
  }

  $A();
}

$B();

// 结果: 八戒 ==> A函数打印

在$A函数执行时,该函数就被放入$B函数中,此时$A在访问变量时就会查找$B函数作用域中的变量,是的打印结果为 八戒 ==> A函数打印

两种工作模式的简单理解

        词法作用域: 代码在编写时的嵌套关系就是作用域的嵌套关系,此种方式注重作用域的声明位置

        动态作用域: 代码在执行时的调用关系就是作用域的嵌套关系,此种方式注重作用域的调用位置

修改词法作用域的两种方式

        一、使用eval函数

        该函数接收一个字符串作为参数

var num = 10086;

function $A(){
    eval('var num = 10010');
    console.log(num);
}

$A();

// 结果 10010

        该方式可以认为是eval函数在当前作用域中强行插入了一个变量声明,当函数在执行时按照变量的查找顺序,就会优先使用当前作用域的变量,也就是eval函数强行插入的变量

        当然该方式并不被推荐使用,具体原因请见

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/eval

        二、使用with函数 

        该方法已经被正式弃用所有就不写了,我就偷个懒,如果你有兴趣自行了解

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/with

???

        需要限制变量的使用范围 ==> 创建作用域

        如何确定作用域与作用域之间的关系 ==> 选择使用那种作用域的工作模型

        该文章仅仅是学习过程的中理解,如果存在问题,欢迎提出与讨论

参考书籍

       《YOU DON'T KNOW JS》

PCL基础:getTransformation函数全流程解析与应用实例,一篇文章精通点云变换 在 Eigen 和 PCL 中,getTransformation是一个常用的函数,用于根据输入的平移和旋转信息(如欧拉角或四元数)生成一个仿射变换矩阵(Eigen::Affine3f或 Eigen::Affine3d)。1)在 Eigen 中,可以通过四元数和平移向量构造一个变换矩阵。2)讲解了从四元数转换到欧拉角,或者从欧拉角转换到四元数的方法。 阅读详情

相关推荐

英飞凌 AURIX TC3XX 系列单片机的 NVM-Flash 介绍

简单介绍英飞凌 AURIX TC3XX 系列多核单片机的 Flash,便于快速上手使用

大橙子的博客 6595

深入理解javascript作用域第二篇之词法作用域动态作用域

主要介绍了javascript作用域第二篇之词法作用域动态作用域的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友可以参考下

艾略特波浪震荡指标(Elliott Wave Oscillator) - MetaTrader 4脚本.zip

艾略特波浪震荡指标(Elliott Wave Oscillator)

JS基础之词法作用域动态作用域

JS基础之词法作用域(静态作用域)和动态作用域

weixin_45364386的博客 1005

JavaScript静态作用域动态作用域

概述 在文章最开始,先学习几个概念: 作用域:《你不知道的js》中指出,作用域是一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找。简单来说,作用域规定了如何查找变量。 静态作用域:又称词法作用域,是指作用域在此法阶段就被确定了,不会改变。 动态作用域:函数的作用域在函数调用时才决定的。 静态作用域动态作用域 JavaScript采用的是词法作用域,函数定义的位置就决定了函数的作用域。 具体看一个例子: var val = 1; function test()

战场小包的博客 2040

动态作用域与词法作用域

作用域 作用域是指程序源代码中定义变量的区域。 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。 JavaScript 采用词法作用域(lexical scoping),也就是静态作用域。 静态作用域动态作用域 因为 JavaScript 采用的是词法作用域,函数的作用域在函数定义的时候就决定了。 而与词法作用域相对的是动态作用域,函数的作用域是在函...

dglf54292的博客 153

Js作用域之词法作用域动态作用域

本文简述了词法作用域动态作用域的区别

周家姑娘的博客 656

javascript静态作用域动态作用域

静态作用域指的是一段代码,在它执行之前就已经确定了它的作用域,简单来说就是在执行之前就确定了它可以应用哪些地方的作用域(变量)。 动态作用域–函数的作用域是在函数调用的时候才决定的 JavaScript采用的是词法作用域即静态作用域; // 静态作用域: var a = 10; function fn() { var b = 1; console.log(a + b); } fn(); // 11 在创建fn函数时的时候就已经确定了它可以作用哪些变量,如果函数fn里面有变量a就直

weixin_45093753的博客 376

前端js入门——JavaScript 作用域

在MDN或者其他权威教程上,对于作用域的解释无一例外是与可见性和生命周期相关。 作为最重要的概念之一,初学者往往会惑于上述高大上的理论阐述。 所以从浅显处入手,可能更有助于对于概念的入门和深入理解。 作用域通俗的讲就是变量或者函数的“势力范围”,在此范围内,变量可以被引用,函数可以被调用。 JavaScript具有两种作用域: (1).全局作用域。 (2).函数作用域。 特别说明:ES2015新增...

fenghulun的博客 7395

JavaScript-什么是作用域作用域作用域链,js没有块级作用域

作用域概述 在任何编程语言中都有作用域的概念,简单来说,所谓的作用域就是变量可作用的范围(可被访问到的区域) 在 JavaScript 中有两种作用域类型,一种是全局作用域另一种是局部作用域 想要理解作用域就必须要理解全局变量和局部变量 全局变量 在网页的所有脚本和函数都能够访问到的变量就是全局变量 如何定义全局变量: 在函数外部定义的变量,就是 全局变量 在函数内部,省略关键字 var ...

weixin_44486539的博客 293

JsJavaScript作用域

JavaScript作用域 1. 什么是作用域 作用域是代码中的某些特定部分中变量,函数和对象的可访问性。 换句话说,作用域决定了代码区块中变量和其他资源的生命周期和可见性。变量在作用域之外是不可见的。 JavaScript作用域包括: 全局作用域 模块作用域 函数作用域作用域 词法作用域 2. 全局作用域 在任何函数、块或模块范围之外定义的变量具有全局作用域。具有全局作用域的变量可以在程序的任意位置访问。 创建全局作用域, 这里分两种情况来说: 一种是在具有模块系统的情况

m0_57135756的博客 300

javascript作用域有几种,js 作用域作用域

和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域,例如下列代码中的blogName和函数innerSay都只拥有局部作用域。let/const 声明并不会被提升到当前代码块的顶部,因此你需要手动将 let/const 声明放置到顶部,以便让变量在整个代码块内部可用。在JavaScript中,作用域为可访问变量,对象,函数的集合,它分为局部作用域和全局作用域。块级作用域所声明的变量在指定块的作用域外无法被访问。

阿发狗伪原创 124

JavaScriptJS中变量的作用域

前几天在项目开发过程中发现两个if语句当中定义相同的变量,居然会相互影响。代码大概如下所示: if (1 == 1){ var obj = {name: "hello"}; $("body").click(function () { alert(obj.name) }) } if (2 == 2){ var obj = {name: "Hi"} } 点击事件触发后,发现输出的是Hi。我当时就考虑到应该和JS变量的作用域有关,所以就去学习了一下,并写下

心生的小鱼专栏 837

JavaScriptjs中说说你对作用域链的理解

引擎会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域。可见上述代码中在函数内部声明的变量或函数,在函数外部是无法访问的,这说明在函数内部定义的变量或者方法只是函数作用域。任何不在函数中或是大括号中声明的变量,都是在全局作用域下,全局作用域下声明的变量可以在程序的任意位置访问。把作用域比喻成一个建筑,这份建筑代表程序中的嵌套作用域链,第一层代表当前的执行作用域,顶层代表全局作用域。变量,当我们在全局访问这个变量的时候,系统会报错。

一个前端开发者 290

JavaScript Js作用域精解。什么是Js作用域,有什么用?

文章目录详解作用域作用域链1 JS代码执行步骤2 JS预编译2.1 AO对象2.2 GO对象2.3 [[scope]]作用域2.4 scope chain作用域链3 函数执行时作用域及数据变化3.1 第一步:定义外层函数a3.2 第二步:执行函数a3.3 第三步:定义内层函数b3.4 第四步:执行函数b3.5 解析:函数执行前后的AO、GO变化闭包1 闭包定义2 闭包的主要作用3 闭包应用4 缺点4 缺点 详解作用域作用域链 友情链接渡一教育 首先,再要搞明白什么是作用域什么是作用域链之前,先要明白几

SillyBoy的博客 307

JS - 关于改变Javascript作用域

关于Javascript静态作用域的一些心得。 之前在看JS大牛BYVoid的>时, 学习到了最能说明Javascript静态作用域特性的代码, 如下: var scope = "global"; function f1() { console.log(scope); } f1() // output: global function f2() { scope = "f2"

evan2916的专栏 2295

js--高级JavaScript作用域

前言 前面的博客基本上已经将JavaScript的基础知识介绍完毕,现在开始总结一些更高端一点的JavaScript技术。这篇博客就从作用域作用域链这方面来介绍。 内容 所谓作用域就是指代码有效的区域 常常使用某些设计模式起到封装作用,因为变量容易被替换,所以我们的js代码就不安全,在我们实际使用的时候,应该杜绝使用全局变量,这个时候就用到了设计模式,大家统称沙箱模式 Ja...

罗俊 319

JavaScript基础】作用域 作用域链 上下文 执行上下文

1.作用域 scope 作用域概念是理解JavaScript的关键所在,不仅仅从性能角度,还包括从功能角度。 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,换句话说,作用域决定了代码区块中变量和其他资源的可见性。在JavaScript中变量的作用域有全局作用域和局部作用域JavaScript采用词法作用域(lexical scoping),也就是静态作用域。 1.1 静态作用域动态作用域 词法作用域:词法作用域是指在词法分析阶段就确定了,不会改变。变量的作用域是在定义时决定而

mirror_Mx的博客 433

js静态作用域动态作用域

js静态作用域动态作用域

weixin_45663702的博客 1461

理清JS中的词法、静态、动态、函数、块作用域

额刚刚写了好多,结果被我误操作覆盖掉了,我的心血 ╥﹏╥… 没关系重新写一遍,也提醒同样在这个平台写博客并且像我一样使用markdown语言码字的同学 “保存线上到草稿”是一个好习惯,嗯嗯 今天双十一,感觉该剁手了。。很多同学在学习JavaScript的时候,可能会听说“各种各样”的作用域 什么词法作用域、静态作用域动态作用域、函数作用域、块作用域 傻傻分不清楚 下面我就给大家理清一下

尐轩web前端网络日志 3115

JavaScript静态作用域动态作用域

动态作用域; 静态作用域

rudy24的博客 2708
下一篇: 循环与闭包
CSDN_Random_Name
博客等级 码龄3年 97粉丝 10原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值