提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
1.全局作用域(Scope)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
/*
作用域(作用区域)
* - 作用域值得是一个变量的作用范围
* - 在JS中一共有两种作用域:
* 1.全局作用域
* - 直接编写script标签中的JS代码,都在全局作用域
* - 全局作用域在页面打开时创建,在页面关闭时销毁(那就在不同页面可以用同一个名字)
* - 在全局作用域中有一个全局对象window
* 它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用
* - 在全局作用域中
* 创建的变量都会作为window对象的属性保存
* 创建的函数都会作为window对象的方法保存:也就是说函数的调用实际上就是window方法的调用
* - 全局作用域中的变量都是全局变量
* 在页面得任意得部分都可以访问的到
* 举例:相当于教室黑板,谁进来都可以看得到黑白,故黑板是一个抽象的全局变量
*
*
*
* 2.函数的作用域(局部作用域)
*
*
*
*/
/*function fun(){
var a = 123;//a的作用范围只能在函数中
}
fun();*/
//fun();同等于 window.fun();
//console.log(a);
/*举例一:
全局作用域中的变量都是全局变量
* 在页面得任意得部分都可以访问的到
* */
var a = 10;
var b = 20;
//var c = "hello";
//console.log(window.c);变量都会作为window对象的属性保存
function fun(){
console.log("我是fun函数");
}
fun();
//fun();同等于 window.fun(); window的fun()方法调用
</script>
</head>
<body>
</body>
</html>
2.变量和函数的提前声明
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
//方法二:
//var a;
/*
变量的声明提前
* - 使用var 关键字声明的变量,会在所有的代码之前被声明 (只是声明不会赋值)
* 但是如果声明变量时不使用var关键字,则变量不会被声明提前
*
* ctrl+方向上下键挪动代码行
* */
//console.log("a = "+a);//显示 undefined
//方法一://var a = 123//如果不写var 就相当于window.a = 123
//a = 123;//方法二提前声明了
/*
函数的声明提前
* 一般形式创建的函数:
* - 使用函数的声明形式创建的函数function 函数名(){}
* 它会在所有的代码行执行之前就被创建,所以我们可以在函数声明之前来调用函数
*
* 字面量创建的函数:
* - 使用函数表达式创建的函数,不会被声明提前,所以不能在声明提前调用
* 得先把函数赋值给变量之后 再调用函数
* var fun2 = function(){}
* fun2();
*
* */
fun();//显示:我是一个fun函数
fun2();//显示: undefined
//函数声明 会被提前创建
function fun(){
console.log("我是一个fun函数");
}
//函数表达式 不会被提前创建
var fun2 = function(){
console.log("我是一个fun2函数");
//使用这个函数表达式,var fun2;会被在上面提前声明,但是是在39行才开始赋值的
//是先执行了fun2();再赋值的,所以会显示undefined
};
/*fun();//显示:我是一个fun函数
fun2();//显示: 我是一个fun2函数*/
</script>
</head>
<body>
</body>
</html>
3.函数的(局部)作用域
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
函数作用域
* - 调用函数时创建函数的作用域,函数执行完毕以后,函数作用域销毁
* - 每调用一次函数就会创建一个新的函数作用域域,他们之间是相互独立的(每调用一次执行一次)
* - 在函数作用域中可以访问到全局作用域的变量
* 在全局作用域 当中 无 法访问到 函数作用域内部中的变量
* 总结:从里面可以看到外面,从外面看不到里面
*
* - 当在函数作用域中操作一个变量时(举例二),
* 它会先在自身作用域中寻找,如果有就可以直接使用。
* 没有的话就采用就近原则,往上一级找直到找到全局作用域
* 如果全局作用域中依然没有找到,则会报错ReferenceError引用异常
* - 在函数作用域当中,没有使用window就是局部的,使用window是全局的值
*/
//创建一个全局变量
/*var a =10;
function fun(){
console.log("a=" +a);
}
fun();
//fun(); 函数作用域是相互独立的
//fun(); 整体当中的一个局部
//fun();*/
/*
就近原则举例一
* */
/*var a =10;
function fun(){
var a="我是函数中的变量a";
console.log("a=" +a);//显示:a=我是函数中的变量a
}
fun();
console.log("a=" +a);//显示:a=10;
*/
/*就近原则举例二:从本身往上找的*/
var a =10;
function fun(){
var a="我是函数中的变量a";
function fun2(){
//这样可以找到局部变量的值
console.log("a=" +a);//显示:a=我是函数中的变量a
//如果上一级没有var a="我是函数中的变量a";
//直接输出 a = 10;
//但是我就是想找到上面哪个全局变量的值,所以
console.log("a=" +window.a);//使用全局变量的对象调用就可以 显示10
}
fun2();
}
fun();
//console.log("a=" +a);//显示:a=10;
/*带var 的变量调用
在函数作用域当中也有声明提前的特性
使用var关键字来声明变量,会在函数中所有的代码块执行之前被声明
*/
/*function fun3(){
//相当于 var a;没有赋值 有a但是没有赋值
console.log(a);//输出:undefined
var a =35;
//相当于 a= 35
}
fun3();*/
/*函数声明前调用
其实fun4就相当于一个小的全局作用域
*/
/*function fun4(){
fun5();//在函数声明前调用
var a =35;
function fun5(){
alert("i'm fun5");
}
}
fun4();*/
//生命周期比较短。使用时间短,调用完了就销毁了。fun4();
/*
在函数中,不使用var声明的变量都会成为全局变量
* window.名
* */
var c =33;
function fun6(){
/*情况一*/ //var c;有一个隐藏和没有赋值的c
//console.log("c = "+c);//就会显示undefined
//var c = 10;
/*情况二*/
console.log("c = "+c);
c = 10;//没有使用var声明,所以表示没有c。直接找上一级,输出 c=33
}
fun6();
/*情况三,全局输出 当 没有声明var的时候,所以声明c = 10 的时候就是等于 window.c=10变为全局变量了*/
console.log("c = "+c);//显示33 和 10
/*举例四:有形参的时候*/
/*function fun7(e){
//var e;相当于声明了变量
alert(e);//显示undefined
}
fun6();*/
</script>
</head>
<body>
</body>
</html>
4.debug的使用
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
debug 断点调试
浏览器运行 - 脚本 - 选择断点行 - 点击单点跳过 - 看右边的变量值发生的变化
*
*
*
*
*
* */
//a b d 会提前声明变量
alert(d);
var a = 10 ;
var b = "hello";
c = true;
function fun(){
alert("hello");
}
var d = 35;
</script>
</head>
<body>
</body>
</html>
5.函数的练习
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
说出以下代码的执行结果咯
*
*
*/
/*1.------------*/
/*var a = 123;
function fun(){
alert(a);
}
fun();
结果:123
* */
/*2.------------*/
/*var a = 123;
function fun(){
/ var a;默认
alert(a); //undefined
var a =456;
}
fun();
alert(a);//显示123
结果: undefined 123
函数内部可以使用全局变量
全局变量不能使用内部函数数据
* */
/*3.------------*/
/*var a = 123;
function fun(){
alert(a);//显示123 上一级a=123
a = 456;//没有var 默认为 window.a=456全局变量
}
fun();
alert(a);//显示456 上一级a=456
结果: 123 456
都变为全局变量,按照就近原则,找上一级最近的
*/
/*4.------------*/
/*var a = 123;
function fun(a){
alert(a);//undefined
a = 456;//这里括号里有一个形参a就表示着 在函数里面声明了var a;
}
fun();
alert(a);//显示123
结果:undefined 123 (括号里有一个形参a就表示着 a是内部函数的值了 不能用了)
*
*/
/*5.------------*/
/*var a = 123;
function fun(a){
alert(a);//显示123
a = 456;//这里a = 456已经变为函数内部的值了 在前已经声明var了,不属于全局变量了
}
fun(123);
alert(a);//显示123
*/
</script>
</head>
<body>
</body>
</html>
6.this的使用
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
解析器在调用函数每次都会向函数内部传递进一个隐含的参数
这个隐含的参数就是this,this指向的是一个对象
这个对象我们称为函数执行的上下文对象(this指向)
根据函数的调用方式的不同,this会指向不同的对象
1.以函数的形式调用时,this永远都是window
2.以方法的形式调用时,this就就是调用方法的那个对象
*
*
* */
function fun(){//(a,b)
//console.log("a= "+a+ ",b="+b); 显示undefined
console.log(this.name);//浏览器给我们传过来的
/*复习:
* 现在的this指的是 obj 或者 obj2
*
* 调用哪一个this指向的就是哪一个
*
*/
}
/*一句话:this就像 在当前的fun中指哪打哪*/
/*举例一:对象的this 根据环境来使用this*/
//创建一个对象
var obj = {
name:"孙悟空",
sayName:fun
};
//console.log(obj.sayName == fun);//显示true
//fun();//显示:window
var obj2 = {
name:"猪八戒",
sayName:fun
};
/*对象的name属性:
以方法的形式调用,this是调用方法的对象(obj)
*/
obj.sayName();//显示孙悟空
obj2.sayName();//显示猪八戒
/*复习*/
//和this.name有关系,也就是说this调用对象是不固定的,执行哪个就调动哪个
/*举例二:全局的this 根据环境来使用this*/
var name = "全局的name属性";
//以函数的形式调用 this是window
fun();//显示 全局的name属性
//等于 window.fun(); 这样就会有了this指哪打哪的作用
</script>
</head>
<body>
</body>
</html>
7.this的补充说明
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
//创建一个name变量
var name = "全局";
//创建一个fun()函数
function fun(){
//console.log(name);
//console.log(obj.name);一个一个输入太麻烦
//console.log(obj2.name);一个一个输入太麻烦
console.log(this.name);//自动适配:孙
}
//创建两个对象
var obj = {
name:"孙悟空",
sayName:fun
};
var obj2 = {
name:"猪八戒",
sayName:fun
};
//fun();显示 全局
//我们希望调用obj.sayName()时可以输出obj的名字
obj.sayName();//显示 全局 because sayName就是fun函数,这里调用的是fun函数,所以函数里面没有name值,就直接往上找
</script>
</head>
<body>
</body>
</html>
8.使用方法创建工厂
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
创建一个对象
*
*
*/
//写固定的普通对象obj
/* var obj = {
name:"孙悟空",
age:18,
gender:"男",
sayName:function(){
alert(this.name);
}
};*/
//更加灵活:工厂实例化
/*
使用工厂方法创建对象
* 通过该方法可以大批量的创建对象
*
*/
function createPerson(name , age , gender){
//创建一个新的对象
var obj = new Object();
//向对象当中添加属性
/*obj.name = "孙悟空";
obj.age = 18; 写固定了
obj.gender = "男";*/
//利用参数传递值
obj.name = name;
obj.age = age;
obj.gender = gender;
obj.sayName = function(){
alert(this.name);
}
/*obj 代表的是一个对象
* 所谓对象就是所他可以包纳万物
* 无论是Number bool 还是String
* 或这是其他实列都包含在里面
* 然而Return就是需要将处理过后的结果返回出去
* 就相当于一个工厂
* 我提供原材料然而工厂输出的将会是产品
*
*/
//将新的对象返回到函数中,让函数自己输出
return obj;
}
//obj1和obj2和obj3就是工厂实例化的对象
var obj1 = createPerson("孙悟空",18,"男");
var obj2 = createPerson("猪八戒",28,"男");
var obj3 = createPerson("沙悟净",28,"男");
/*console.log(obj1);
console.log(obj2);
console.log(obj3);*/
obj1.sayName();//显示 孙悟空
</script>
</head>
<body>
</body>
</html>
9.test使用工厂方法创建对象练习
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
使用工厂方法创建对象练习
*
*
*/
/*function createPerson(name , age , gender){
//创建一个对象使用
var obj = new Object();
//创建对象属性:通过参数传递
obj.name = name;
obj.age = age;
obj.gender = gender;
obj.sayName = function(){
console.log(this.name);//为什么一次只能写一次
//console.log(this.name,this.age);
}
//返回一个新的对象,因为函数需要有一个值能够返回其结果并告诉函数
return obj;
};
var obj1 = createPerson("周启永",20,"男");
obj1.sayName();*/
//使用工厂方法
function bulider(name , age , gender){
var obj = new Object();
//设置属性:单个值,单个函数
obj.name = name;
obj.age = age;
obj.gender = gender;
obj.sayName = function(){
alert(this.name);
alert(this.age);
alert(this.gender);
}
return obj;
}
var obj1 = bulider("周启永",18,"男");
obj1.sayName();
</script>
</head>
<body>
</body>
</html>
总结