<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
// function add (){
// var a = 3;
// return a
// }
//一般情况下,函数声明的局部变量,在函数调用完之后就会被销毁掉
// console.log(add())
// add()
//
//
// function add(){
// var a = 3
// return function(){
// return a
// }
// }
//
// abc = add()
// console.log(abc())
//闭包的好处
// var list = [f0,f1,f2]
// f0()---->0
// f1()---->1
// f2()---->2
//假设需要一个列表,这个列表存放n个函数,只要调用list[i](),那么就会返回i
//-----------------------------------案例1:
// var list = []
//
// for(var i=0;i<3;i++){
// var temfn = function(){
// return i
// }
// list.push(temfn)//将函数添加进列表
// }
//
// console.log(list)
// list[0]() //====> 3
//----------------------------------案例1:解决方案
var list = []
for (var i=0;i<3;i++){
//匿名函数通过自己调用自己执行,获取i值传入num参数
//num参数这个变量被返回的匿名函数所引用,所以参数num不会被销毁,使得num参数可以保留。
var temfn = (function(num){
return function(){
return num
}
})(i)
list.push(temfn)
}
// console.log(list[0]())
function Counter(){
var num = 0
return function(){
num ++
return num;
}
}
var abc = Counter()
console.log(abc())
console.log(abc())
console.log(abc())
//能不用闭包,就尽量不用闭包,因为会导致内存的可使用量下降(内存泄漏)
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
// a = add(3,4)
// console.log(a)
//将一个匿名函数给到1个变量
// var add = function(a,b){
// a = a + 1;
// b = b + 1;
// return a+b
//
// console.log(123)
// }
//直接申明函数的方式
// function add (a,b){
// a = a + 1;
// b = b + 1;
// return a+b
// }
//注意:直接申明函数的方式,浏览器会自动将它提升到最前面。
//js不会对函数的参数进行检查
// a = add()
// console.log(a)
//
//返回值通过return返回出去,return语句执行之后,不会再继续执行函数后面的内容。
// function add(a=3,b=4){
// console.log(a,b)
// a = a + 1;
// b = b + 1;
//
// return a+b
// }
function add(a,b){
if(a==undefined){
a = 3
}
if(b == undefined){
b = 4
}
a = a + 1;
b = b + 1;
return a+b
}
console.log(add())
var student = {name:'xx',age:16}
function abc(){
//在函数里面,用var申明使这个函数的局部变量,在其他地方是拿不到的
var num = 3
var student = {name:'666'}
return student.name
}
console.log(abc())
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//1、字面量的方式,偶尔创建一个特定的对象,那么就是最简单和便捷方式
var student = {
name:'xx',
age:'xx'
}
//2、构造函数的方式
var student = {}//构造一个新的空对象
var student = new Object()//构造一个新的空对象
student.name = 'xx'
student.age = 'xx'
//3、创建一个函数来构造一个对象,工厂模式
function Student(name,age){
var student = {}
student.name = name;
student.age = age
return student
}
var s1 = Student('xx','xx');
var s2 = Student('mingzi','nianling')
//4、构造一个构造函数,通过构造函数,实例化一个对象
function Student(name,age){
this.name = name;
this.age = age
this.showName = function(){
console.log(this.name)
}
//没有返回值
}
var s3 = new Student('gzhanshu','xxx')
//如果使用了new 调用函数,那么首先会创建1个对象,并且将这个对象赋值s3,如果函数里有this,那么这个this就是这个新创建的对象
var s4 = Student('yyy','uuu')//如果没有new,就是一个普通函数,那么普通函数没有返回值,就是未定义
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//构造一个构造函数,通过构造函数,实例化一个对象
function Student(name,age){
this.name = name;
this.age = age
console.log(name)
//没有返回值
}
function Man(){
this.run= function(){
console.log('会跑')
}
this.showName = function(){
console.log(this.name)
}
}
var man = new Man()
//设定构造函数对象的属性prototype,将原型对象给到这个prototype属性
Student.prototype = man
var s3 = new Student('gzhanshu','xxx')
//原型对象也可以有原型,那么原型的原型所形成的链式,那么就叫做原型链
//原型里面属性方法可以被,实例化的对象共享。大大的减少内存的消耗
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//对象也存放一组数据的地方
//student,学生姓名,学生年龄,会考试,会读书,会唱歌
//字面量的方式
var student = {
name:'老王',
age:'30',
dizhi:'隔壁',
isMan:true,
son:{name:'xiaowang',age:3},
action:function(){
console.log('拐卖良家妇女')
}
}
console.log(student)
//想要获取里面的属性
// student['属性值']
// student.属性值
// 我们如果想要用变量的情况下,那么就要用中括号。
// student.xuehao = 123456789
// student['xuehao'] = 12432342
// console.log(student)
var student2 = new Object()
student2.name = 'xxzz'
student2.age = 16
console.log(student2)
</script>
</body>
</html>