JavaScript中的作用域

1.什么是作用域?
作用域是在运行代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。
从下面的例子可以体会到作用域的概念,变量invariable在全局变量中没有声明,所以在全局作用域下取值会报错。**我们可以这样理解:作用域就是一个独立的地盘,变量不会外泄、暴露出去,也就是说作用域最大的用处就是隔离变量,不同作用域下同名变量不会冲突。
示例:


   function outFun2(){
    var invariable="内层变量2";
    }
   //outFun2();//要先执行这个函数
   console.log(invariable);//invariable is not defined

2.全局作用域和局部作用域
在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:
(1)最外层函数和在最外层函数外面定义的变量拥有全局作用域。

      var outVariable="我是最外层变量";
function outFun() {
    var invariable="内层变量";
    function innerFun() {//内层函数
        console.log(invariable);
    }
    innerFun();
}
console.log(outVariable);//我是最外层变量
outFun();//调用函数,内层变量
console.log(invariable);//invariable is not defined
innerFun();//innerFun is not defined

(2)所有未定义直接赋值的变量自动声明为拥有全局作用域

function outFun2(){
    variable ="未定义直接赋值的变量";
    var invariable2="内层变量2";
}
outFun2();//要先执行这个函数
console.log(invariable);//未定义直接赋值的变量
console.log(invariable2);//invariable2 is not defined

(3)所有window对象的属性拥有全局作用域
一般情况下,window对象的内置属性都拥有全局作用域,例如:window.name、window.location、window.top等等。
全局作用域有个弊端:如果我们写了很多行js代码,变量定义都没有用函数包括,那么它们就全部都在全局作用域中。这样就会污染全局命名空间,容易引起命名冲突。
这就是为何jquery、Zepto等库的源码,所有的代码都会放在(function(){…})()中,因为放在里面的变量都不会被外泄或者暴露,不会污染到外面,不会对其他库或js脚本造成影响,这是函数作用域的一个体现。
函数作用域,是指声明在函数内部的变量,和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部。

function dosomething() {
    var blogname="浪里行舟";
    function innersay() {
        alert(blogname);
    }
    innersay();
}
alert(blogname);//脚本错误
innersay();//脚本错误

作用域是分层的,内层作用域可以访问外层作用域的变量,反之不行。

3.块级作用域的概念
ES6之前JavaScript没有块级作用域,只有全局作用域和函数作用域。ES6的到来,为我们提供了块级作用域,可通过新增命令let 和const来体现。
块级作用域可通过新增命令let和const声明,所声明的变量在指定块的作用域外无法被访问。块级作用域在如下情况被创建:
1.在一个函数内部
2.在一个代码块内部

let声明的语法与var的语法一致,基本可以用let来代替var进行变量声明,但会将变量的作用域限制在当前代码块中。块级作用域有以下特点:
(1)声明不会被提升到当前代码块的顶部
(2)禁止重复声明
(3)循环中绑定块级作用域的妙用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值