作用域的理解
作用域的概念,在js中其实蛮重要的,包括我自己也觉得比较难,所以写个博客记录一下,首先js中有3个作用域分别为函数作用域、全局作用域、块作用域(ES6),所谓作用域我认为就是用来读写变量用的(var 变量 console.log(变量)),我很容易陷入一个误区,就是函数是对象,那么为什么对象没有作用域,还有this是不是指向的作用域,对象不是作用域的根本原因是因为它不能读取变量,比如声明变量,对象只是一个容器,里面存放着很多属性,以下例子能很好地说明对象没有作用域这个概念:
function fun(){
var a = 1
const p ={
fun: function (){
a++
console.log(a)
if(a>10){
return
}else{
fun()
//p.fun()
}
}
}
return p
}
var s =fun()
s.fun()
我们可以看到else的条件中 如果我们选择fun(),因为闭包的关系最终a=2,如果我们选择p.fun()那么最终的结果是 2 3 4 5 6 7 8 9 10,因为 fun !== p.fun,这就涉及到作用域链的问题了,当代码执行时,先进入全局作用域,当函数执行的时候,进入函数作用域,因为 对象是没有作用域的,所以 fun()执行的时候 会产生一个上下文执行对象如果上下文执行对象中没有的属性 会往父级作用域(全局)中去寻找 变量名为fun 的函数。如果我们要指定执行对象p中的fun()的函数 那么就需要p.fun()去指定对象中的函数。
this 的指向问题,其实this本身不是指向作用域的,他是指向对象的,谁调用了函数,this就指向谁。记住一句话,如果要有作用域 一定要可以声明变量(var)。否则就没有作用域。对象中的是属性 不是变量需要通过xxx.xxx去访问。