作用域的理解

作用域的理解

作用域的概念,在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去访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值