作用域

Author Avatar
Ninefire 6月 08, 2018
  • 在其它设备中阅读本文章

作用域

  • 作用域指一个变量的作用范围
  • 在JS中共有2种作用域
    • 全局作用域
    • 函数作用域

全局作用域

  • 直接编写在script标签中的JS代码,都在全局作用域。
  • 全局作用域在页面打开时创建,在页面关闭时销毁。
  • 在全局作用域中有一个全局对象window,它代表浏览器的窗口,由浏览器创建,我们可以直接使用。
  • 在全局作用域中:
    • 创建的变量都会作为window对象的属性保存。
    • 创建的函数都会作为window对象的方法保存。
  • 全局作用域中的变量都是全局变量,在页面的任意位置都可以访问。

变量的声明提前

  • 使用var关键字声明的对象,会在所有的代码执行之前被声明,但是不会赋值。
  • 如果声明变量时不适用var关键字,则变不会被声明提前,当顺序执行至声明语句时才被声明。
    console.log(a);
    var a = 123;
    // 结果是:undefined
    
    console.log(a);
    a = 123;
    //结果是:报错
    

函数的声明提前

  • 使用函数声明形式创建的函数function 函数(){};,会在所有代码执行之前就被创建,因此可以在函数声明钱调用函数。
  • 使用函数表达式创建的函数,不会被提前声明,因此不能再声明前调用。
fun1();
// 函数声明,会被提前创建
function fun1(){
    console.log("我是函数声明创建的函数");
}
// 结果是:我是函数声明创建的函数
fun2();
// 函数表达式,不会被提前
var fun2 = function(){
    console.log("我是函数表达式创建的函数");
}
// 结果是:undefined is not a function.
// 一个未定义的对象被赋值给了变量fun2

函数作用域

  • 调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁。
  • 每调用一次函数就会创建一个新的函数作用域,它们之间是互相独立的。
  • 在函数作用域中可以访问到全局作用域的变量。
  • 在全局作用域中无法访问到函数作用域的变量。
  • 在函数作用域中操作一个变量时,它会现在自身作用域中寻找该变量,如果有则直接使用,如果没有则向上一级作用域中寻找。
  • 在函数中若要访问全局变量可以使用window对象。
  • 在函数中,不使用var声明的变量都会成为全局变量。
// 创建一个全局变量
var a = 10;

function test(){
    // 创建一个函数内的变量
    var a = "我是函数中的变量a~~~";
    var b = 20;
    console.log("a=" + a); // a=10
    console.log(a); // 我是函数中的变量a~~~
}

console.log("b=" + b); // b is not defined.
console.log(a); // 10
var a = 22;

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

console.log(a); // 22
var a = 22;

function fun(){
    console.log(a); // 22
    a = 11; // 此处成为全局变量操作
}

console.log(a); // 11

如发现错误请联系我,谢谢你。
本文链接:http://ninefire.tk/JavaScript.basics/11.html