函数作用域

函数作用域

变量的与函数的作用范围

  • 作用域,顾名思义就是作用范围,也被称为生存范围或者说存在的范围;

在ECMAScript 5 的规范中,作用域只有两种,一种是‘全局作用域’,一种是函数作用域

  • 在函数外部声明的变量可以给当前代码块所有的函数使用对所有函数都有效,也成为‘全局作用域’。
  • 在函数内部声明的变量只能影响到变量所在函数体本身,无法从外部对函数内部的变量进行调用,被称为‘函数作用域’

对于一个最外层函数来说,在函数体外部声明的变量就是‘全局变量’,可以在函数内部进行调用;

var a = "world"
function s(){
    console.log("hello"+a)
}
//输出 “hello world”

以上demo我在函数外部声明了一个变量a并对其进行了赋值,在函数内部函数也调用到了全局属性 a的值。

function text(){
var a = "你怎么穿着品如的衣服,还用他的东西?"
}
console.log(a)
//a is not defined  结果出现了报错

我在函数内部声明了一个变量a,并且在函数外面对变量a进行了调用,结果出现了报错

函数内部声明的变量会覆盖函数外面全局属性变量,类似于css样式覆盖中的特性,作用作用域越小,变量的覆盖性越高。

demo:

var a = "你怎么,穿着品如的衣服?"
function text(){
 var a = "你是说我骚么?"
    console.log(a) //你是说我骚么?
}
text();//你是说我骚么?
console.log(a)//你怎么,穿着品如的衣服?

在上面的demo中我在函数外面声明了一个变量,同时在函数里面声明了一个变量,结果调用函数的结果出来的是函数里面的变量,而在函数外面调用了一个变量结果是调用了全局变量。所以函数外面的变量与函数里面的变量发生冲突时,函数作用域大于全局作用域,可见函数作用域只作用于函数本身,出了函数体,变量又会恢复过来。

函数内部的变量提升

与全局作用域一样,函数内部的变量也会产生‘变量提升’现象,特性和全局变量一样,只不过函数内部的局部变量提升的是到当前函数体的最上方,而全局变量提升到当前代码块的最上方。

 function text(){
        var a = "我喜欢品如";
        console.log(a+b); //
        var b = "因为她够骚.";
        console.log(a +b)
    }
    text()//输出的为 我喜欢品如undefined和我喜欢品品如,因为她够骚。

以上代码把变量b提升到了代码块最前方,所以调用函数的时候输出的时undefind而不是 b is not defined,上面代码可以理解为以下代码;

demo:

 function text(){
    var a 
    var b
    a = “我喜欢品如”
    console.log(a+b)
    b = "因为她够骚";
}

函数本身的作用域。

  • 之前我说到,函数在js中和变量时同一个级别的,也就是说函数也是一个可以运行的值。,所以既然是一个可以运行并调用的值,那么它也有着自己的作用域
  • ‘函数的作用域’与变量相同,就是它声明时所在的区域,###需要注意的是!函数的作用域和调用时所在的作用域没有关系。也就是说,即使在调用函数的所在函数体内重新声明了被调用函数中的变量,声明的变量是不会影响到被调用的函数的。
    demo:
    var a = 1
    var b =function(){
       console.log(a);//函数输出是1
}
    function f(){
    var a = 2;
    b();//直接把b整个代码搬过来
}
    f()//输出函数结果仍是1
posted @ 2019-05-09 01:17  des杜甫  阅读(1046)  评论(0编辑  收藏  举报