局部变量和外部变量
-
在JavaScript(ES5之前)中没有块级作用域的概念,但是函数可以定义自己的作用域。
- 作用域(Scope)表示一些标识符的作用有效范围(所以也有被翻译为有效范围的);
- 函数的作用域表示在函数内部定义的变量,只有在函数内部可以被访问到;
-
外部变量和局部变量的概念:
- 定义在函数内部的变量,被称之为局部变量(Local Variables)。
- 定义在函数外部的变量,被称之为外部变量(Outer Variables)。
-
什么是全局变量?
- 在函数之外声明的变量(在script中声明的),称之为全局变量。
- 全局变量在任何函数中都是可见的。
- 通过var声明的全局变量会在window对象上添加一个属性(了解);
-
在函数中,访问变量的顺序是什么呢?
- 优先访问自己函数中的变量,没有找到时,在外部中访问。(就近原则)
-
关于块级作用域、作用域链、变量提升、AO、VO、GO等概念我们后续将进行学习。
-
关于上面说的只有函数代码块有自己的作用域请看如下例子:
// 1.作用域的理解:message在哪一个范围内可以被使用, 称之为message的作用域(scope) // 全局变量: 全局作用域 var message = "Hello World" if (true) { console.log(message) } function foo() { console.log("在foo中访问", message) } foo() // 2.ES5之前是没有块级作用域(var定义的变量是没有块级作用域) { var count = 100 console.log("在代码块中访问count:", count) } console.log("在代码块外面访问count:", count) // -----可以访问 // for循环的代码块也是没有自己的作用域 for (var i = 0; i < 3; i++) { var foo = "foo" } console.log("for循环外面访问foo:", foo) // ------可以访问 console.log("for循环外面访问i:", i) // 3 // 3.ES5之前函数代码块是会形成自己的作用域 // 意味着在函数内部定义的变量外面是访问不到的 function test() { var bar = "bar" } test() console.log("test函数外面访问bar:", bar) // ---报错,变量未定义,访问不了 // 函数有自己的作用域: 函数内部定义的变量只有函数内部能访问到 function sayHello() { var nickname = "kobe" console.log("sayHello函数的内部:", nickname) function hi() { console.log("hi function~") console.log("在hi函数中访问nickname:", nickname) } hi() } sayHello() console.log("sayHello外面访问nickname:", nickname) // -----不能访问