位置: 编程技术 - 正文

javascript中的作用域和上下文使用简要概述(javascript概述及作用)

编辑:rootadmin
javascript中的作用域(scope)和上下文(context)是这门语言的独到之处,这部分归功于他们带来的灵活性。每个函数有不同的变量上下文和作用域。这些概念是javascript中一些强大的设计模式的后盾。然而这也给开发人员带来很大困惑。下面全面揭示了javascript中的上下文和作用域的不同,以及各种设计模式如何使用他们。 上下文 vs 作用域 首先需要澄清的问题是上下文和作用域是不同的概念。多年来我注意到许多开发者经常将这两个术语混淆,错误的将一个描述为另一个。平心而论,这些术语变得非常混乱不堪。 每个函数调用都有与之相关的作用域和上下文。从根本上说,范围是基于函数(function-based)而上下文是基于对象(object-based)。换句话说,作用域是和每次函数调用时变量的访问有关,并且每次调用都是独立的。上下文总是关键字 this 的值,是调用当前可执行代码的对象的引用。 变量作用域 变量能够被定义在局部或者全局作用域,这导致运行时变量的访问来自不同的作用域。全局变量需被声明在函数体外,在整个运行过程中都存在,能在任何作用域中访问和修改。局部变量仅在函数体内定义,并且每次函数调用都有不同的作用域。这主题是仅在调用中的赋值,求值和对值的操作,不能访问作用域之外的值。 目前javascript不支持块级作用域,块级作用域指在if语句,switch语句,循环语句等语句块中定义变量,这意味着变量不能在语句块之外被访问。当前任何在语句块中定义的变量都能在语句块之外访问。然而,这种情况很快会得到改变,let 关键字已经正式添加到ES6规范。用它来代替var关键字可以将局部变量声明为块级作用域。 "this" 上下文 上下文通常是取决于一个函数如何被调用。当函数作为对象的方法被调用时,this 被设置为调用方法的对象: 同样的原理适用于当调用一个函数时通过new的操作符创建一个对象的实例。当以这种方式调用时,this 的值将被设置为新创建的实例: 当调用一个未绑定函数,this 将被默认设置为 全局上下文(global context) 或window对象(如果在浏览器中)。然而如果函数在严格模式下被执行("use strict"),this的值将被默认设置为undefined。 执行上下文和作用域链 javascript是一个单线程语言,这意味着在浏览器中同时只能做一件事情。当javascript解释器初始执行代码,它首先默认竟如全局上下文。每次调用一个函数将会创建一个新的执行上下文。 这里经常发生混淆,这术语”执行上下文(execution context)“在这里的所要表达的意思是作用域,不是前面讨论的上下文。这是槽糕的命名,然而这术语ECMAScript规范所定义的,无奈的遵守吧。 每次新创建一个执行上下文,会被添加到作用域链的顶部,又是也成为执行或调用栈。浏览器总是运行在位于作用域链顶部当前执行上下文。一旦完成,它(当前执行上下文)将从栈顶被移除并且将控制权归还给之前的执行上下文。例如: 运行前面的代码将会导致嵌套的函数被从上倒下执行直到 fourth 函数,此时作用域链从上到下为: fourth, third, second, first, global。fourth 函数能够访问全局变量和任何在first,second和third函数中定义的变量,就如同访问自己的变量一样。一旦fourth函数执行完成,fourth晕高兴上下文将被从作用域链顶端移除并且执行将返回到thrid函数。这一过程持续进行直到所有代码已完成执行。 不同执行上下文之间的变量命名冲突通过攀爬作用域链解决,从局部直到全局。这意味着具有相同名称的局部变量在作用域链中有更高的优先级。 简单的说,每次你试图访问函数执行上下文中的变量时,查找进程总是从自己的变量对象开始。如果在自己的变量对象中没发现要查找的变量,继续搜索作用域链。它将攀爬作用域链检查每一个执行上下文的变量对象去寻找和变量名称匹配的值。 闭包 当一个嵌套的函数在定义(作用域)的外面被访问,以至它可以在外部函数返回后被执行,此时一个闭包形成。它(闭包)维护(在内部函数中)对外部函数中局部变量,arguments和函数声明的访问。封装允许我们从外部作用域中隐藏和保护执行上下文,而暴露公共接口,通过接口进一步操作。一个简单的例子看起来如下: 其中最流行的闭包类型是广为人知的模块模式。它允许你模拟公共的,私有的和特权成员: 模块实际上有些类似于单例,在末尾添加一对括号,当解释器解释完后立即执行(立即执行函数)。闭包执行上下位的外部唯一可用的成员是返回对象中公用的方法和属性(例如Module.publicMethod)。然而,所有的私有属性和方法在整个程序的生命周期中都将存在,由于(闭包)使执行上下文收到保护,和变量的交互要通过公用的方法。 另一种类型的闭包叫做立即调用函数表达式(immediately-invoked function expression IIFE),无非是一个在window上下文中的自调用匿名函数(self-invoked anonymous function)。 对保护全局命名空间,这种表达式非常有用,所有在函数体内声明的变量都是局部变量,并通过闭包在整个运行环境保持存在。这种封装源代码的方式对程序和框架都是非常流行的,通常暴露单一全局接口与外界交互。 Call 和 Apply 这两个简单的方法,内建在所有的函数中,允许在自定义上下文中执行函数。call 函数需要参数列表而 apply 函数允许你传递参数为数组: 执行的结果是相同的,user 函数在window上下文上被调用,并提供了相同的三个参数。 ECMAScript 5 (ES5)引入了Function.prototype.bind方法来控制上下文,它返回一个新函数,这函数(的上下文)被永久绑定到bind方法的第一个参数,无论函数被如何调用。它通过闭包修正函数的上下文,下面是为不支持的浏览器提供的方案: 它常用在上下文丢失:面向对象和事件处理。这点有必要的因为 节点的addEventListener 方法总保持函数执行的上下文为事件处理被绑定的节点,这点很重要。然而如果你使用高级面向对象技术并且需要维护回调函数的上下文是方法的实例,你必须手动调整上下文。这就是bind 带来的方便: 当回顾bind函数的源代码,你可能注意到下面这一行相对简单的代码,调用Array的一个方法: 有趣的是,这里需要注意的是arguments对象实际上并不是一个数组,然而它经常被描述为类数组(array-like)对象,很向 nodelist(document.getElementsByTagName()方法返回的结果)。他们包含lenght属性,值能够被索引,但他们仍然不是数组,由于他们不支持原生的数组方法,比如slice和push。然而,由于他们有和数组类似的行为,数组的方法能被调用和劫持。如果你想这样,在类数组的上下文中执行数组方法,可参照上面的例子。 这种调用其他对象方法的技术也被应用到面向对象中,当在javascript中模仿经典继承(类继承): 通过在子类(MyClass)的实例中调用超类(MySuperClass)的方法,我们能重现这种强大的设计模式。 结论 在你开始学习高级设计模式之前理解这些概念是非常重要的,由于作用域和上下文在现代javascript中扮演重要的和根本的角色。无论我们谈论闭包,面向对象,和继承或各种原生实现,上下文和作用域都扮演重要角色。如果你的目标是掌握javascript语言并深入了解它的组成,作用域和上下文应该是你的起点。 译者补充 作者实现的bind函数是不完全的,调用bind返回的函数时不能传递参数,下面的代码修复了这个问题:

推荐整理分享javascript中的作用域和上下文使用简要概述(javascript概述及作用),希望有所帮助,仅作参考,欢迎阅读内容。

javascript中的作用域和上下文使用简要概述(javascript概述及作用)

文章相关热门搜索词:javascript的主要用途,javascript的主要用途,javascript的作业,javascript的主要用途,javascript的作业,javascript概述及作用,javascript中的作用域预解析与声明变量提升,javascript中的作用域预解析与声明变量提升,内容如对您有帮助,希望把文章链接给更多的朋友!

Javascript全局变量var与不var的区别深入解析 相信你对全局变量一定不陌生,在函数作用域里用a=1这种形式定义的变量会是一个全局变量,在全局作用域里,用下面3种形式都可以创建对全局可见的

JavaScript—window对象使用示例 window对象是JavaScript浏览器对象模型中的顶层对象,包含多个常用方法和属性:1打开新窗口window.open(pageURL,name,parameters)其中:pageURL为子窗口路径name为子

javascript如何创建表格(javascript绘制表格的二种方法) 1、inserRow()和insertCell()函数insertRow()函数可以带参数,形式如下:insertRow(index):index从0开始这个函数将新行添加到index的那一行前,比如insertRow(0),是将

标签: javascript概述及作用

本文链接地址:https://www.jiuchutong.com/biancheng/373683.html 转载请保留说明!

上一篇:JavaScript执行顺序详细介绍(js 函数执行顺序)

下一篇:Javascript全局变量var与不var的区别深入解析(js全局方法)

  • 北京增值税发票打印边距设置
  • 代开的增值税专票需要另外申报附加税吗?
  • 材料采购成本是主营业务成本吗
  • 环境保护税的应税污染物有哪些
  • 投资性房地产出售的会计处理
  • 月末一般无余额的有
  • 采购的货物没有及时到怎么办
  • 社保所属期和缴费期相差一个月吗
  • 财产转让所得的纳税义务发生时间
  • 税法免抵退计算例题
  • 企业所得税预缴计算方法
  • 房地产预售房收入如何缴纳增值税
  • 补提以前年度税费应该计入
  • 小规模纳税人如何升级为一般纳税人
  • 特定业务计算的应纳税所得额是什么意思
  • 工程交税需要什么资料
  • 出口退税可以用电子专用发票吗
  • 经济补偿金如何计税
  • 手撕票验旧是什么意思
  • 营改增后营业外收入交增值税吗?
  • 特定行业职工取得的工资、薪金所得,如何计算个人所得税?
  • 将外购商品用于在建工程计入固定资产成本吗
  • 怎么辨别是非
  • 财务费用错记制造费用
  • 成本类科目有哪四个
  • 回迁房所得税处理
  • 政府补助专项资金账务处理
  • 认缴出资怎么记账
  • PHP:oci_result()的用法_Oracle函数
  • 打印机5b00错误解决
  • win11怎么清理内存
  • 酒店布草洗涤赔偿怎样折旧
  • 应收账款 预收账款合并
  • 抵扣了进项税额
  • 个人承包建筑工程转让协议
  • 业务招待费税前扣除标准按照发生额的60%扣除
  • php流程引擎
  • 黄金期货交易进场规则
  • php安装扩展fileinfo
  • 酒店损益类科目包括哪些
  • php闭包和回调函数
  • 46 个非常有用的成语
  • 生产型企业出口退税计算案例
  • php include和include_once
  • yii2实现根据时间搜索的方法
  • un删除
  • 房地产代理公司资质证书
  • 营运资金为正数说明企业什么
  • 小规模企业跨月发票如何冲红
  • 资产处置损益会计科目
  • 税务查账后如何结转
  • 公司不交工会经费有什么后果?工会经费交费时自愿的么?
  • 报销流程怎么走
  • 普通发票可以改日期吗怎么改
  • 如何加强存货管理,提高存货周转率
  • 以前年度多计提成本怎么处理
  • 进项增值税发票抵扣期限
  • 合伙企业所得税率
  • 当月发票未到怎么做账
  • 企业装卸费抵扣怎么做账
  • 应收款挂账是什么意思
  • mysql存文章的字段设置为多大?
  • 如何解决windows10数据放到国外进行处理
  • 如何更改mac图标
  • ubuntu做lvm
  • Win10 Mobile RS2预览版14904升级截图曝光
  • centos zsh
  • win8开机直接进入传统桌面
  • java timer
  • linux编译链接命令
  • css渐变文本效果在哪
  • Node.js中的事件循环是什么
  • java多线程产生死锁
  • scp命令详解(全)
  • 经常用到的图像格式有
  • javascript怎么用
  • javascript用法
  • 重新税务登记程序有哪些
  • 关于车辆购置税的规定,下列说法正确的是
  • 武汉 工资 税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设