三、深入之作用域链

作者: 七_五 | 来源:发表于2017-06-08 19:39 被阅读0次

0x00、引言

其实在分析JS的作用链域我们可以采取一个思想就是:就近原则,下面我们通过一些例子来分析

0x01、从一个demo说起

先看一个之前变量提升中的例子

var a 
function b(){
  console.log(a)       //很明显我们通过变量提升知道,a为函数作用域内的a
  var a
}

那么就近原则又是指的什么了?其实我们只要理解这里的就近是作用域的就近就好了。很明显在上面的demo中有全局作用域的a和函数作用域的a,由于console.log(a)在函数的作用域内,所以这里的a就指的函数作用域弄内声明的变量a。
那么如果上面的代码改成下面这样又该如何了?

var a 
function b(){
  console.log(a)       //函数作用域内没有声明a,就会在全局作用域去查找,那么这里的a指的就是全局作用域的变量a
}

0x02、引入一个概念:词法作用域

我们还是接着上面的例子说起

var a 
function b(){
  console.log(a)       //这里我们并没有调用函数b,仅通过函数的声明就可以判断出这里待执行a是函数作用域内的a
  var a
}

其实上面已经把词法作用域的核心说透了,所谓词法作用域就是JS引擎在编译的时候通过词法分析,不需要等到后面的调用或执行操作,就可以判断出a是什么,且a不会被改变,这就是词法作用域,下面举一个a不会被改变的例子。

var  a 
function b(){
  var a =1 
  c();
  function c(){
    var a
    console.log(a)         //通过词法作用域我们知道a是函数c中的变量a
  }
}
b()        //undefined,调用b的时候虽然console.log(a)执行,但是a已经在词法作用域内被确定了,不需要在访问函数b中的变量a

那么我们这里就有一个疑问了,有没有那种需要等待后面的调用才可以确定自己是谁的了?当然有,我们这里的答案是:this
还是从一个demo说起

var a 
function b(){
  console.log(this)       //这里进行函数声明的时候我们并不知道this指向谁?
}
  • 调用的demo1
var a 
function b(){
  console.log(this)       
}
b()      //在非严格模式下,以函数调用模式时this指向window
  • 调用的demo2
var a 
function b(){
  console.log(this)       
}
b.call({name:qi})      //通过call调用,此时this指向对象{name:qi}

从上面两个例子中我们可以发现:1、不同的函数调用,this将指向不同的东西(这和词法作用域不同);2、this指向谁,只有在函数的调用之时才可以发现

0x03、作用域链总结

1、就近原则
2、词法作用域:词法分析,不需要调用或执行就知道普通变量是什么,且不随调用而被改变
3、this不是词法作用域,必须在调用之后才可以确定this

相关文章

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

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

  • 深入理解闭包(五)——作用域、作用域链和执行上下文

    原文地址:深入理解闭包(五)——作用域、作用域链和执行上下文 作用域,作用域链,执行上下文三者之间有着密切的关系,...

  • 三、深入之作用域链

    0x00、引言 其实在分析JS的作用链域我们可以采取一个思想就是:就近原则,下面我们通过一些例子来分析 0x01、...

  • 作用域链

    原文出处 JavaScript深入之作用域链 作用域链 当查找变量的时候,会先从当前上下文的变量对象中查找,如果没...

  • 深入学习js之——作用域链#5

    开篇 作用域是每种计算机语言最重要的基础之一,因此要想深入的学习JavaScript,作用域和作用域链就是个绕不开...

  • 关于作用域链

    什么是作用域链? 那么在上段代码中,我门可以很清楚的看到三个变量。 等等,如果作用域链是作用域的链条,那么作用域是...

  • 作用域链和闭包

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

  • 深入之作用域及作用域链

    JS运行三部曲1、语法分析2、预编译3、解析执行预编译: 对于函数,执行上下文四部曲:· 1、创建AO对象,· 2...

  • 干货!月薪80k前端大佬面试笔记:JS闭包解析!

    三点注意事项 JS没有块级作用域,只有全局作用域和局部作用域(函数作用域)。 JS中的作用域链,内部的作用域可以访...

  • 作用域链

    作用域链 把多个作用域串起来便形成了作用域链;每个函数在初始化完成之后就拥有了各自的作用域链,但此时的作用域链中并...

网友评论

    本文标题:三、深入之作用域链

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