一、函数的作用域
全局函数:在全局作用域下创建的函数,可以在任意的作用域下调用.
局部函数:在函数作用域下创建的函数,只能在所在的函数作用域下调用
作用域链:多个作用域嵌套形成的结构,在查找变量的时候,首先会到当前作用域下查找,如果当前没有会不断的往上一级作用域查找
函数提升:程序执行前,会将创建的函数提升到所在作用域的最前边
二、递归
在函数的内部调用自身这个函数
递归默认是一个死循环,使用不当造成内存泄漏
内存泄漏:操作系统分配给js空间被占用,无法存储新的数据
使用:在递归之前有边界条件,结合着return
/*var count=0;//用于计数
function say() {
console.log('从前有座山');
count++;
//判断是否为3------边界条件
if(count===3){
//结束函数调用
return;
}
//递归
say();
}
say();//从前有座山 从前有座山 从前有座山
//使用递归计算n的阶乘
function getS(n) {
//边界条件:当n为1的时候,返回1
if(n===1){
return 1;
}
//递归
return n*getS(n-1);
}
console.log( getS(5) );//120
兔子
三、匿名函数(重要)
function (){}
1.创建函数
函数表达式
var fun=function(){
}
函数声明
function fn(){
}
对比函数名称()和函数名称的区别
函数名称() 调用函数,执行函数体中的代码
函数名称 本质上就是一个变量,保存了函数类型数据
//使用匿名函数创建函数getSum,传递任意两个数字,返回两者之间所有整数的和.
var getSum=function (n1,n2){
//获取n1~n2之间所有整数的和
for(var i=n1,sum=0;i<=n2;i++){
sum+=i;
}
return sum;
}
console.log(getSum(1,100));
对比函数声明和函数表达式创建函数的区别
函数声明创建的函数存在函数的整体提升
函数表达式创建的函数只是存在变量声明提升
//面试题
console.log(c);//ƒ c() { = function
var c=5; //用5覆盖之前保存的函数
function c() { //var c=function(){}
console.log(2);
}
console.log(c);//5
2.匿名函数自调用
全局污染:局变量的出现产生影响,任何作用域都可以访问全局变量
function(){
//在一个函数作用域下,声明的变量是局部变量,可以防止全局污染
})();
3.回调函数
将函数作为参数传递
fn(1) fn('ok') fn(true) fn(fun) funfunction(){})
function tao(madai){
madai();//调用传递的回调函数
}
function xin(){}
tao (xin);
tao (function(){ });
四.系统函数
就是JS提供的函数,可以直接调用
isNaN() 检测一个字符串中是否含有非数字,会隐式转换为数值查看是否为NaN, 是>true 不是 >false
练习:声明变量保存用户输入的值,如果输入的值含有非数字,打印'非法的数量'
eval( )执行字符串中的表达式
五.对象
对象是一组属性和方法的集合
一部手机,属性有颜色/品牌/cpu/内存.........方法(功能):打电话/发短信/看视频/办公............
万物皆对象
1.JS中的对象
内置对象,JS提供的对象
自定义对象,自己创建的对象
宿主对象,根据不同的执行环境划分
2.创建自定义对象
(1)对象字面量
(2)内置构造函数
(3)自定义构造函数
3.对象字面量
{属性名:属性值,属性名:属性值....}
属性名的引号可以省略,如果含有特殊字符必须添加
练习:创建一个员工对象,包含员工的编号,姓名,性别,工资
var staff={
id:12,
name:'张三',
sex:'男',
salary:15000
};
console.log(staff);
//console.log(staff);
//访问属性
//console.log(staff.name);//张三
//console.log(staff['dept-name'],staff['salary']);//研发部 15000
//console.log(staff.birthday);//undefined
staff.salary=100000;
staff.birthday='1973-8-3';
console.log(staff);
4.属性的访问
对象.属性名 对象['属性名']
如果访问的属性不存在,则返回undefined
练习:创建一个图书对象,包含的属性有编号,标题,作者,价格;修改价格属性,添加出版社属性;最后打印输出对象
var books={
id:12,
title:'步步惊心',
autor:'于正',
price:20,
press:'人民邮电'
};
books.price=30;
console.log(books);
5.内置构造函数
new Object()
创建一个空对象{},需要单独添加属性
练习:创建班级的对象,包含的属性有编号,中心名称,学员人数.
var team=new Object();
team.id=1;
team.name='web前端';
team.number=20;
console.log(team);//{id: 1, name: 'web前端', number: 20}
6.遍历属性
依次访问对象中每个属性
for(var k in 对象){
k 每个属性名
对象[k] 属性值
}
课后任务
1.复习
2.练习:字面量创建对象,包含一组成绩,遍历对象得到每个成绩,计算出总成绩和平均成绩
var grade={
xiaoming:90,
xiaolan:85,
xiaolv:70,
xiaowei:98
}
var sum=0;
var count=0;
for(var n in grade){
sum+=grade[n];
count++;
}
console.log(sum,count,sum/count);
var student={
s1:80,
s2:90,
s3:98,
s4:75
}
var sum=0;
3.预习数组