作用域分为全局作用域和函数作用域,
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>作用域</title>
<script type="text/javascript">
/*
作用域:指一个变量的作用的范围,在js中有两种作用域
1.全局作用域
-直接编写在script标签中的js代码,都在全局作用域中,
-全局作用域在页面打开时创建,在页面关闭时销毁,
-在全局作用域中有一个全局对象window。它代表的是一个浏览器窗口,
它由浏览器创建,我们可以直接使用,
-在全局作用域中,创建的变量都会作为window的对象属性保存
创建的函数都会作为window对象的方法保存
=全局作用域中的变量都是全局变量,在页面的任意的部分都可以方位的到
变量声明提前:使用var关键字声明,声明的变量,会在所有代码执行之前被声明
(但不会被赋值),但是如果声明变量时不使用var,则变量不会被声明提前
函数提前声明,使用函数声明形式创建的函数,function 函数(){}
它会在所有的代码执行之前就被创建所以我们可以在函数声明前调用
使用函数表达式创建的函数,不会被声明提前,所以不能再声明前调用
*/
fun2();//不可以在声明前调用
fun1();//可在声明前调用
function fun1(){
console.log("我是fun1函数");
}
var fun2 = function(){
console.log("我是fun2函数");
}
// fun2();
/*
}
/*
2.函数作用域
-调用函数时创建函数作用域 函数执行完毕后,函数作用域销毁
-每调用一次函数,就会创建一个新的函数作用域,他们之间是相互独立的
-在函数作用域中可以访问全局作用域中的变量,在全局作用域中无法访问函数作用域的变量
-当在函数作用域中操作一个变量时,会在自身的作用域中寻找,如果有,继续使用,如果没有,往上一级中寻找,直到找到全局作用域
如果全局作用域中依然没有找到,则会报错ReferenceError
-在函数中要访问全局变量可以使用window对象
*/
var a = 10;
function fun(){
var a ="我是fun函数中的变量a";
var b =20;
// console.log("a ="+a);
function fun2(){
console.log("a ="+window.a);
}
fun2();
}
fun();
// console.log("b="+b);
/*
在函数作用域中,也有声明提前的特性,
使用var关键字声明的变量,会在函数中所有代码之前被声明
函数声明也会在函数中所有代码之前执行
*/
function fun3(){
fun4();
console.log(a);
var a =35;
function fun4(){
alert("I'm fun4");
}
}
fun3();
//在函数中,不使用var声明的变量都会成为全局变量
// var c = 33;
function fun5(){
// console.log("c="+c);
c = 20;
}
fun5();
console.log(c);
//形参相当于已经在函数变量中声明了变量
function fun6(e){
alert(e);
}
fun6();
</script>
</head>
</html>
注意:<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>this的用法</title>
<script type="text/javascript">
/*
**解析器在调用函数每次都会向函数内部传递一个隐含的参数
这个隐含的参数就是this,this指向的是一个对象,
这个对象我们成为函数执行的上下文对象
根据函数的调用方式的不同,this会指向不同的对象,
1.以函数的形式调用时,this永远都是window
2.以方法的形式调用时,this就是调用方法的那个对象**
*/
function fun(){
console.log(this.name);
}
fun();
//创建一个对象
var obj = {
name:"孙悟空",
sayName:fun
};
//以方法形式调用,this是调用方法的对象
// obj.sayName();
var name = "全局的name属性";
//以函数形式调用,this是window,
fun();
</script>
</head>
</html>