JavaScript作用域(scope)

  • Post author:
  • Post category:java





前言


作用域即一个变量的作用范围,在js中作用域分为全局作用域和函数作用域




一、全局作用域

——直接编写在script标签中的js代码,都在全局作用域
——全局作用域在页面打开时创建,在页面关闭时销毁
——在全局作用域中有一个全局对象window,它代表的是一个浏览器的窗口,它由浏览器创建,我们可以直接使用


在全局作用域中



创建的变量都会作为window对象的属性保存

创建的函数都会作为window对象的方法保存

var box = 'blue';
function setBox() {
		alert(window.box);//全局变量即window的属性
}
window.setBox();//全局函数即window的方法   

全局作用域中的变量都是全局变量,即在页面的任意位置都可以访问的到



二、函数作用域

——调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
——每调用一次函数就会创建一个新的作用域,他们之间是相互独立的



1.在函数作用域中可以访问到全局作用域的变量

var a=100;
function fun(){
    var b=200;
    //在函数作用域中访问全局作用域中的变量
    console.log(a);//100
}
fun();



2.在全局作用域中无法访问到函数作用域的变量

var a=100;
function fun(){
    var b=200;
}
//在全局作用域中访问函数作用域中的变量
console.log(b);//Uncaught ReferenceError: b is not defined



3.就近原则

当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用,如果没有,则向上一级作用域中寻找,直到找到全局作用域,如果全局作用域中依然没有找到,则会报错ReferenceError(

就近原则

var a = 10;	// 全局作用域
var b = 20;
function fun(x){	// 局部作用域
    var a = 100;	
    var c = 200;
        console.log("fun"+ a, b, c, x);//fun100 20 200 50
        function bar(x){
            var a = 1000;
            d = 300;
                console.log("bar"+ a, b, c, d, x);//bar1000 20 200 300 20
        }
    bar(20);
}
fun(50);

在上面这个例子中var a, var b 是全局作用域对象,fun是函数作用域对象,而 bar 则是嵌套在 fun 函数内部的作用域。

bar函数作用域内输出方法有个输出 b,但 bar作用域内没有 b这个变量,就往上一层 fun 作用域内进行查找,再没有就往再上一层,查找直到顶层为止,如果顶层还没有,就抛出异常(其执行顺序是由内向上,一级一级查找的)


函数内部作用域可以向上逐级查找,是因为顶层对象(属性,变量)对底层对象可见的,反之顶层对象,不能看到底层对象

——在函数中要访问全局变量可以使用window对象(window.a)



4.在函数作用域中有声明提前的特性


使用var关键字声明的变量会在函数中所有的代码执行之前被声明

。下面这两段代码其实完全相同

function fun(){
    console.log(a);
    var a=35;
}
fun();//undefined
function fun(){
    var a;
    console.log(a);
    a=35;
}
fun();//undefined



5.在函数中,不使用var声明的变量都会成为全局变量

	var a = 30;
	function fun() {
		a = 20;
		b = 100;//相当于window.d = 100;是一个全局变量
    }
	fun(); 
	console.log("a = " + a);//a = 20
	console.log("b = " + b);//b = 100



版权声明:本文为l2423282916原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。