美文网首页
Javascript——作用域与作用域链

Javascript——作用域与作用域链

作者: BitterOutsider | 来源:发表于2019-01-12 15:46 被阅读6次

一、作用域

变量的作用域无非就是两种:全局变量和局部变量。
全局作用域:
最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的
局部作用域:
和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的,最常见的例如函数内部。
需要注意的是,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量
来看一个代码:

<script>
  var scope = "global";
  function fn(){
    console.log(scope);//result:undefined
    var scope = "local";
    console.log(scope);//result:local;
  }
  fn();
</script>

第一个输出居然是undefined,原本以为它会访问外部的全局变量(scope=”global”),但是并没有。这可以算是javascript的一个特点,只要函数内定义了一个局部变量,函数在解析的时候都会将这个变量“提前声明”:

<script>
  var scope = "global";
  function fn(){
    var scope;//提前声明了局部变量
    console.log(scope);//result:undefined
    scope = "local";
    console.log(scope);//result:local;
  }
  fn();
</script>

然而,也不能因此草率地将局部作用域定义为:用var声明的变量作用范围起止于花括号之间。
javascript并没有块级作用域
那什么是块级作用域?
像在C/C++中,花括号内中的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的,比如下面的c语言代码:

for(int i = 0; i < 10; i++){
//i的作用范围只在这个for循环
}
printf("%d",&i);//error

但是javascript不同,并没有所谓的块级作用域,javascript的作用域是相对函数而言的,可以称为函数作用域
示例一:

<script>
  for(var i = 1; i < 10; i++){
  //coding
  }
  console.log(i); //10  
</script>

示例二:

<script>
  var name="global";
  if(true){
    var name="local";
    console.log(name); //local
  }
  console.log(name);  //local
</script>

二、作用域链

那什么是作用域链?
总的来说根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,它决定了哪些数据能被函数访问 。
来看一段代码:

name="hbh";
function t(){
    var name="thbh";
    function s(){
        var name="shbh";
        console.log(name);
    }
    function ss(){
        console.log(name);
    }
    s();
    ss();
}
t();

当执行s时,将创建函数s的执行环境(调用对象),并将该对象置于链表开头,然后将函数t的调用对象链接在之后,最后是全局对象。然后从链表开头寻找变量name,很明显
name是"shbh"。
但执行ss()时,作用域链是: ss()->t()->window,所以name是”thbh"。

总结一下:

  1. 函数在执行的过程中,先从自己内部找变量
  2. 如果找不到,再从创建当前函数所在的作用域去找, 以此往上
  3. 注意找的是变量的当前的状态

相关文章
JavaScript关于作用域、作用域链和闭包的理解
Js作用域与作用域链详解

相关文章

  • javascript基础知识问答-作用域和闭包

    1.理解词法作用域和动态作用域2.理解JavaScript的作用域和作用域链3.理解JavaScript的执行上下...

  • 2018-04-11

    JavaScript作用域链浅析 1、作用域 作用域指的是变量存在的范围。在ES5规范中,JavaScript只有...

  • 作用域和闭包

    一、理解 JavaScript 的作用域、作用域链和内部原理 作用域 javascript 拥有一套设计良好的规则...

  • JavaScript作用域学习笔记

    @(JS技巧)[JavaScript, 作用域] JavaScript作用域学习笔记 概念: 作用域就是变量与函数...

  • JavaScript 作用域和作用域链

    JavaScript 作用域 作用域就是变量与函数的可访问范围。在JavaScript中,变量的作用域有全局作用域...

  • JS_0: 执行环境和作用域链

    JavaScript,目前对于执行环境和作用域链的理解 什么是作用域链? 要讲作用域链就得先讲执行环境。 每个函数...

  • 作用域链和闭包

    在谈作用域链之前先说一下与作用域链关系紧密的执行环境和作用域。 作用域:作用域指的是变量的适用范围。 作用域链:作...

  • 作用域

    JavaScript以函数为作用域。 2 作用域在被调用之前,已经被创建了。 3 函数的作用域存在作用域链,也是在...

  • JavaScript作用域链和闭包究竟是什么

    JavaScript作用域链 作用域 作用域就是变量和函数的可访问范围, 控制着变量和函数的可见性与生命周期, 在...

  • JavaScript深入系列的学习(一)

    JavaScript深入之从原型到原型链JavaScript深入之词法作用域和动态作用域JavaScript深入之...

网友评论

      本文标题:Javascript——作用域与作用域链

      本文链接:https://www.haomeiwen.com/subject/kkccdqtx.html