文章目录

前言

一:函数作用域


JavaScript系列从入门到精通系列第十八篇:JavaScript中的函数作用域-LMLPHP

前言

        我们刚才提到了,在<Script>标签当中进行定义的变量、对象、函数对象都属于全局作用域,全局作用域在页面打开的时候生效在页面关闭的时候失效。

一:函数作用域

        调用函数时创建函数作用域,函数执行完毕之后作用域销毁。

        没调用一次函数就会生成一个新的函数作用域。

var a = 10;

function fun(){
    console.log(a);//10
}

        函数作用域是局部的,在函数作用域当中可以访问到全局作用域的变量。

function fun(){
    var b = 10;
    console.log(b);
}


console.log(b);//这里会报错。

        这样写就有问题了,全局无法访问局部的内容。

var a = 100;

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


console.log(a);//100

        当我们在函数作用域当中操作一个变量时,会先在自身作用域当中进行寻找。如果没有就前往上一级进行寻找。

        上一级不一定是全局哦。函数里边嵌套函数的这种情况,里边的函数的上一级就是外层函数的作用域。

function fun(){
    var a = 100;

    var b = 10;

    function fun2 (){

        console.log(a);
    }


}

        层层往上级进行寻找如果还是没有的话,就该报错了。如果想在函数中想访问全局的,在变量名字前添加window就行了。

        在函数作用域当中使用var声明的变量也有一个声明提前的作用:

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

fun();

        也就是在函数声明也会在函数中所有的代码执行之前被声明,但是没有赋值。

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

        但是如果是这样则另当别论了:

var c = 10;

function fun(){
    console.log(10);//undefined
    var c = 20;
}

fun();

        这个打印的结果最终是undefined,因为同样的变量C有去全全局的有函数作用域的肯定使用函数作用域的,函数作用域的基于var声明的会被提前但是不被赋值。所以打印的是undefined。

        那么如果不使用var呢?

var c = 35;


function fun(){
    console.log(10);
    c = 100;
}

        这个用C的时候找不到就往上级去找,然后最终打印的记过是35

function fun(){
    
    d = 100;
}

console.log(d);//100

        在函数中不使用var修饰的话,会被声明为全局变量。

var e = 23;

function fun(e){
    alert(e);
}


fun();

        定义了形参就相当于在函数当中基于var声明了变量

JavaScript系列从入门到精通系列第十八篇:JavaScript中的函数作用域-LMLPHP

JavaScript系列从入门到精通系列第十八篇:JavaScript中的函数作用域-LMLPHP

10-11 05:19