广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >javascript作用域和作用域链详解
  • 141
分享到

javascript作用域和作用域链详解

2024-04-02 19:04:59 141人浏览 独家记忆
摘要

目录一、javascript的作用域1、全局作用域2、局部作用域二、javascript的作用域链三、作用域链和优化四、改变作用域链1、with语法改变作用域链2、catch语法总结

一、javascript的作用域

1、全局作用域

1、最外层函数和最外层函数定义的变量
var age = 20
function func1() {
  var sex = "男"
  function func2() {
    console.log("hello func2")
  }
  func2()
}
console.log(age)    //20
console.log(func1)  //正常执行
console.log(func2)  //报错
console.log(sex)    //报错
2、所有未直接声明的变量,直接赋值为全局变量
function func1() {
  var age = 20
  sex = "男"
}
func1()
console.log(sex)    //男
console.log(age)    //报错
3、window对象上面的属性具有全局作用域
function func1() {
  var age = 20
  sex = "男"
  console.log(top)   //window....
  
}
func1()
console.log(sex)   //"男"
console.log(top)   //window....

2、局部作用域

和全局作用域相反,局部作用域只在函数内部可以访问到。function func1() {  var age = 20  func1()  function func1() {    console.log("func1")  }}func1()和全局作用域相反,局部作用域只在函数内部可以访问到。
function func1() {
  var age = 20
  func1()

  function func1() {
    console.log("func1")
  }
}
func1()

二、javascript的作用域链

函数也是对象,在函数内部存在一个属性[[scope]],该属性包含可以访问属性的集合。决定了哪些属性在函数中可以访问到。
下面我们以一个函数的例子来详细解说一下,函数作用域链。
1、在函数函数创建出来时。代码如下所示
function add(num1, num2) {
  return num1 + num2
}

在这里插入图片描述

函数初始化时,会将自己的作用域链中放入全局变量
var total = add(10, 20)
这里是函数执行时,当执行时会创建一个新的对象放入作用域链中,这个对象中包括
arguments, 形参,this,以及返回值。

在这里插入图片描述

active object是活跃对象,是函数执行时创建的对象,然后scope chain类似于栈结构,函数执行前压入栈中,函数执行结束就从栈中弹出。函数访问属性的过程就是沿着scope chain从上往下一次查找。

三、作用域链和优化

从上面的例子中,我们可以看出,访问全局作用域是最慢的,因为需要依次从上往下进行查找,应当尽可能少的使用全局变量,应该尽可能使用局部变量。如果在函数
中,使用多次全局变量,我们可以将全局变量转化为局部变量,然后在使用局部变量。
function changeColor(){
    document.getElementById("btnChange").onclick=function(){
        document.getElementById("targetcanvas").style.backgroundColor="red";
    };
}
上面代码我们使用了两次document,但是document作为全局变量,此时我们应该将其转化为局部变量来使用,所以下面为转化后的代码。
function changeColor(){
    var doc=document;
    doc.getElementById("btnChange").onclick=function(){
        doc.getElementById("targetCanvas").style.backgroundColor="red";
    };
}

四、改变作用域链

1、with语法改变作用域链

with语法的作用就是为了解决代码重写问题,是对象快捷书写方式,但是这么好的方式,为什么不大力推广使用呢?因为性能存在一些问题。function initUI(){    with(document){        var bd=body,            links=getElementsByTagName("a"),            i=0,            len=links.length;        while(i < len){            update(links[i++]);        }        getElementById("btnInit").onclick=function(){            doSomething();        };    }}这里使用with语法省略了document。with语法的作用就是为了解决代码重写问题,是对象快捷书写方式,但是这么好的方式,为什么不大力推广使用呢?
因为性能存在一些问题。
function initUI(){
    with(document){
        var bd=body,
            links=getElementsByTagName("a"),
            i=0,
            len=links.length;
        while(i < len){
            update(links[i++]);
        }
        getElementById("btnInit").onclick=function(){
            doSomething();
        };
    }
}
这里使用with语法省略了document。

在这里插入图片描述

with传入的对象的属性放入最上层,剩余的都往下压,导致局部变量的访问代价增大,所以with的性能不好。

2、catch语法

我们在使用try--catch时,当代码执行错误时,会执行catch函数,catch函数中参数是错误对象,就是这个错误对象,会放到作用域链的头部。
但是try--catch我们在必要的使用得使用,我们可以这样解决。
try{
    doSomething();
}catch(ex){
    alert(ex.message); //作用域链在此处改变
}

处理后:
try{
    doSomething();
}catch(ex){
    handleError(ex); //委托给处理器方法
}
解决方案是:将catch错误处理交给另外一个函数进行处理。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: javascript作用域和作用域链详解

本文链接: https://www.lsjlt.com/news/163459.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • javascript作用域和作用域链详解
    目录一、javascript的作用域1、全局作用域2、局部作用域二、javascript的作用域链三、作用域链和优化四、改变作用域链1、with语法改变作用域链2、catch语法总结...
    99+
    2022-11-13
  • Javascript的作用域、作用域链以及闭包详解
    一、javascript中的作用域 ①全局变量-函数体外部进行声明 ②局部变量-函数体内部进行声明 1)函数级作用域 javascript语言中局部变量不同于C#、Java等高级语言...
    99+
    2022-11-13
  • JavaScript详细解析之作用域链
    以上就是JavaScript详细解析之作用域链的详细内容,更多请关注编程网其它相关文章!...
    99+
    2022-11-22
    JavaScript 前端
  • Javascript的作用域和作用域链是什么
    这篇文章主要介绍Javascript的作用域和作用域链是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Javascript 的作用域和作用域链作用域: 作用域是定义变量...
    99+
    2022-10-19
  • 如何分析javascript作用域和作用域链
    如何分析javascript作用域和作用域链,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、javascript的作用域1、全局作用域1、最外层函数和最外层函...
    99+
    2023-06-28
  • JavaScript作用域与作用域链使用重点讲解
    作用域和作用域链方面的知识是JS的重点,去面试十个有八个都会问你这块的知识,所以说这块是特别特别的重要,下面我们好好理解一下作用域和作用域链到底是个什么: 先上一段代码: var a...
    99+
    2022-11-13
    JS作用域与作用域链 JS作用域 JS作用域链
  • JavaScript作用域和作用域链的示例分析
    这篇文章给大家分享的是有关JavaScript作用域和作用域链的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。作用域(Scope)1. 什么是作用域作用域是在运行时代码中...
    99+
    2022-10-19
  • 详解JavaScript作用域
    这篇文章主要介绍“详解JavaScript作用域”,在日常操作中,相信很多人在详解JavaScript作用域问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”详解JavaScri...
    99+
    2022-10-19
  • 实例详解JavaScript静态作用域和动态作用域
    目录前言 静态作用域与动态作用域 静态作用域执行过程 动态作用域执行过程 习题 习题一 习题二 习题三 总结 前言 在文章最开始,先学习几个概念: 作用域:《你不知道的j...
    99+
    2022-11-12
  • JavaScript作用域与作用域链优化方式
    目录前言内容作用域作用域的嵌套作用域的一些实现细节作用域链相关优化总结前言 作用域和作用域链是所有JavaScript开发人员每天都要接触和应用的内容。不管是面试中的作用域链的面试考...
    99+
    2022-11-13
  • JavaScript深入理解作用域链与闭包详情
    目录深入作用域链与闭包作用域链[[Environment]]完善环境记录闭包函数实例什么是闭包变量绑定同一个闭包总结深入作用域链与闭包 为什么要把作用域链和闭包放在一起讲呢,它们有什...
    99+
    2022-11-13
  • JavaScript作用域链是什么
    本篇内容介绍了“JavaScript作用域链是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!作用域1....
    99+
    2022-10-19
  • Javascript之作用域、作用域链、闭包的示例分析
    这篇文章主要介绍Javascript之作用域、作用域链、闭包的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是作用域?作用域是一种规则,在代码编译阶段就确定了,规定了变量...
    99+
    2022-10-19
  • 什么是作用域与作用域链
    本篇内容主要讲解“什么是作用域与作用域链”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是作用域与作用域链”吧!作用域如果说执行上下文是代码的执行环境,那么作...
    99+
    2022-10-19
  • 图解JavaScript作用域链底层原理
    目录前言 作用域 1.什么是作用域 2.[[Scopes]]属性 3.作用域链 4.图解查找变量原理 总结 前言 在学习JavaScript时大家一定都知道,外部空间不能访问内部变...
    99+
    2022-11-12
  • JS作用域作用链及this使用原理详解
    目录变量提升的原理:JavaScript的执行顺序第一部分:变量提升部分的代码第二部分:代码执行部分代码执行阶段调用栈:栈溢出的原理如何利用调用栈1.使用浏览器查看调用栈的信息2.小...
    99+
    2022-11-13
    JS作用域作用链this JS作用域作用链
  • 怎么使用作用域与作用域链
    这篇文章主要讲解了“怎么使用作用域与作用域链”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用作用域与作用域链”吧!一、作用域如果说执行上下文是代码的执...
    99+
    2022-10-19
  • js作用域及作用域链工作引擎
    目录前言一、作用域(scope)1.作用域的分类2.函数体作用域3.块级作用域二、预编译三、作用域链前言 我们需要先知道的是引擎,引擎的工作简单粗暴,就是负责javascript从头...
    99+
    2022-11-13
  • JS作用域和作用域链的区别是什么
    本篇内容介绍了“JS作用域和作用域链的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!作用域(Sc...
    99+
    2022-10-19
  • JavaScript的作用域链有什么用
    JavaScript的作用域链有什么用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JavaScript的作用域链这是一个非常...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作