深入理解JavaScript作用域

前言

对于许多新手开发者来说,作用域的概念并不是很容易理解。这个东西也是面试中会比较常问的问题。这篇文章来为大家说一下作用域。

作用域

任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
换句话说作用域决定了代码区块中变量和其他资源的可见性

让我们先来看个例子

function fn() {
	var variable = "内部变量";
}
fn();//先执行函数
console.log(variable);//报错 variable is not defined

 

这里我们就可以看出作用域的概念,变量 variable 在函数 fn 内部声明,全局作用域没有声明,所以在全局作用域下访问 variable 会报错。

我们也可以这样理解:作用域就是一个独立的区域,让变量不在泄露出去。它最大的作用就是隔离变量,使其不会受到污染

在JavaScript中,变量的作用域有全局作用域和局部作用域两种。

var a=20;
function fn(){
    var sum=0;
    console.log(a);//20   局部访问全局
}
fn()//先执行
console.log(sum)//报错  全局访问局部

 

上面这个例子我们可以看到作用域的特点:局部可以访问全局的变量,但全局不能访问局部的变量

1、全局作用域

全局作用域在任何地方都可以进行访问,函数的外面叫做全局作用域(不包括函数嵌套)

在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:

(1)最外层函数和在最外层函数外面定义的变量拥有全局作用域,例如:

var sum = "全局变量"; //最外层变量
function fn() { //最外层函数
    var num = "局部变量";
    function Fun() { //内层函数
        alert('内层访问全局 '+ sum);
    }
    Fun();
}
alert('外层访问全局 ' + sum); //我是最外层变量
fn(); //内层变量
alert('外层访问局部 ' + num); //num is not defined
Fun(); //Fun is not defined

 

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

function outFun2() {
    num = "未定义直接赋值的变量";
    var sun = "局部变量";
}
outFun2();//先执行函数
alert(num); //未定义直接赋值的变量
alert(sun); //sun is not defined

(3)所有window对象的属性拥有全局作用域

一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。

全局作用域有个严重的弊端:如果我们写了很多行 JS 代码,变量定义都定义在全局作用域中。这样就会 污染全局命名空间, 容易引起命名冲突。造成变量污染

// a 写的代码
var num = 12;

// b 写的代码
var num = 10;

alert(num)// 10

2、局部作用域

局部作用域又叫做函数作用域,是指声明在函数内部的变量。和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部。

function fn(){
    var num="局部变量";
    function Fun(){
        alert('内层访问局部 ' + num);//局部访问局部
    }
    Fun();
}
fn()
alert('外层访问局部 ' + num)

 

总结:

作用域特点:局部可以访问全局的变量,但全局不能访问局部的变量
全局作用域:在任何地方都可以进行访问,函数的外面叫做全局作用域(不包括函数嵌套)
局部作用域:函数内部的变量,只能在局部访问

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值