一 代码
1 全局作用域
这个比较好理解,就是声明的变量都是全局的,并且保存在页面window对象中,作为window的属性。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 1. 作用域
* - 作用域指一个变量的作用的范围
* - 在JS中一共有两种作用域:
* 1.全局作用域
* - 直接编写在script标签中的JS代码,都在全局作用域
* - 全局作用域在页面打开时创建,在页面关闭时销毁
* - 在全局作用域中有一个全局对象window,
* 它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用
* - 在全局作用域中:
* 创建的变量都会作为window对象的属性保存
* 创建的函数都会作为window对象的方法保存
* - 全局作用域中的变量都是全局变量,
* 在页面的任意的部分都可以访问的到
*
* 2.函数作用域
*
*/
var a = 10;
var b = 20;
//var c = "hello";
//console.log(window.c);
function fun(){
console.log("我是fun函数");
}
//window.fun();
//window.alert("hello");
</script>
</head>
<body>
</body>
</html>
2 变量、函数的声明提前
js的声明与C/C++不一样,js的声明即使你在代码中写在使用之后,它也不会报错。因为js解析器会帮你将程序所有的变量的声明提前。
具体看下面例子即可。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 1. 变量的声明提前
* - 使用var关键字声明的变量,会在所有的代码执行之前被声明(但是不会赋值),
* 但是如果声明变量时不适用var关键字,则变量不会被声明提前
*
* 2. 函数的声明提前
* - 使用函数声明形式创建的函数 function 函数(){}
* 它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数。
* - 使用函数表达式 var fun2 = function(){}; 创建的函数,虽然会被声明提前,但是由于未创建,
* 所以不知道它的数据类型(undefined),故不能直接当做函数来调用,会报错,所以使用函数表达式不能在声明前调用。
* 注:他本来写的是使用函数表达式"不会被声明提前",但视频是会被声明提前,所以应该是写错了。
*/
// 一 测试变量的声明提前
console.log("a = "+a); // 提前使用a不会报错,但是会输出:a = undefined
var a = 123;
// 上面两行被解析器解析后等价于:
// var a;
// console.log("a = "+a);
// a = 123;
// 二 测试函数的不同创建方法,验证函数的声明提前
fun(); // 输出:"我是一个fun函数"
//函数声明,会被提前创建
function fun(){
console.log("我是一个fun函数");
}
console.log(typeof fun2); // 输出:undefined
//fun2(); // 直接报错,因为是undefined,解析器不知道你是否是函数,故不能当做函数调用,但确实被提前声明了,只不过没有创建。
//函数表达式,不会被提前创建
var fun2 = function(){
console.log("我是fun2函数");
};
</script>
</head>
<body>
</body>
</html>
实际开发中,我们按照正常的声明、调用顺序,就不会出现这种问题了。