作用域与变量的声明提前
全局作用域
<script>
/*
*作用域
* 指一个变量作用的范围
* -在js中一共有两种作用域,
* 1、全局作用域
* -直接编写在script标签中的JS代码,都在全局作用域
* -全局作用域在页面打开时创建,在页面关闭时销毁
* -在全局作用域中有一个全局对象windows(窗口),我们可以直接使用
* 它代表浏览器窗口,它由浏览器创建,它可以直接在页面中使用
* -在全局作用域中:
* 创建的变量都会作为window对象的属性保存-------a作为window对象的属性保存了
* 创建的函数都会作为window对象的方法保存
* -全局作用域中的变量都是全局变量,在页面的任意部分都可以访问到
* 2、函数作用域
*/
/* function fun(){
var a = 123;
}
fun();
console.log(a);//函数外无法输出a */
var a = 10;
var b = 20;
// var c = "hello"
// console.log(window.c); //没有var c = "hello",但是有vara、b---此时显示undefined
function fun() {
console.log("我是fun函数");
}
// fun();//这个函数会作为window对象的方法保存 等于----window.fun();记住不同执行方式打印出的值相同
// alert("hello");等同于window.alert("hello");---所为的函数其实就是window对象的方法
</script>
变量的声明提前
<script>
/*
*变量的声明提前
* - 使用var开头关键字声明的变量,会在所有的代码执行前被声明//相当于var a 会在所有代码执行之前跑到最前面第一个执行(但是不会赋值)
* 但是如果声明变量时不使用var关键字,则变量不会被声明提前
* 所以,总结:使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用
*/
/*单独解释使用var开头关键字声明的变量
var a;
console.log("a ="+a);
a = 123;//显示undefined(不写var,开头不写或者本行也不写就会报错
*/
/*
*函数的声明提前
* -使用函数声明形式创建的函数function 函数(){};---称为函数声明,会最先创建和解析,无论放在调用前还是调用后
* 它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数
*/
//fun();
console.log(fun2);//变量是有的显示undefined,因为undefined不是函数,调用fun2();会报错
//函数声明,会被提前创建
function fun(){
console.log("我是一个fun函数");
}
//函数表达式,不会被提前创建
var fun2 = function(){//fun2最先声明但未赋值,执行到当行(此行61行)才会执行。使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用
console.log("我是一个fun2函数")
}
//调用函数
//fun()------提前可以打印显示函数,但是fun2()提前会报错
//fun2();//调用fun2会显示fun函数里面的值
</script>