函数


1.函数

Number()/parseInt()/parseFloat()/alert()/prompt()...

函数分为系统函数和自定义函数

函数:是一个功能体,需要提供若干个数据,返回结果,用于封装重复执行的代码 —— 煎饼机

1.1创建普通函数

function 函数名称(){ 函数体 —— 封装的代码}

function laba(){
 //函数体
 console.log('又香又脆的煎饼');
 console.log('所有煎饼一律15折');
 console.log('快来买吧');
}
//调用
//laba();
1.2创建带有参数的函数

function 函数名称(参数列表){ //用于接收外部传递的数据 函数体}

函数名称(参数列表) //实际传递的数据

创建函数时的参数称为*形参*,调用函数时的参数称为*实参*,实参会赋值给形参,形参的数量可以和实参的数量不匹配,如果形参未赋值为undefined

function add(a,b){//形参
 //console.log(a+b);
 console.log(a,b);
}
1.3创建带有返回值的函数

function 函数名称(参数列表){ 函数体 return 值; //返回值,函数调用后得到的结果}

return用于函数调用后得到的结果,如果函数中没有return或者return后没有加值,得到的结果是undefined;一旦return执行,就会跳出函数,结束函数的执行。

function getMax(a,b){
 //判断a和b的大小
 /*
if(a>b){
  return a;
}else{
  return b;
}
*/
 return a>b ? a : b;
}

使用switch-case

1-等待付款 2-等待发货 3-运输中 4-已签收 5-已取消 其它-无法追踪

*对比return和break*return是用于跳出函数,结束函数的调用break是用于跳出循环、switch-case,结束对应语句的执行

//练习:创建函数getStatus,传递订单的状态码,返回对应的汉字状态
//使用switch-case
//1-等待付款 2-等待发货 3-运输中 4-已签收 5-已取消 其它-无法追踪
function getStatus(n){
 switch(n){
   case 1:
 return '等待付款';
 //break;
case 2:
 return '等待发货';
 //break;
case 3:
 return '运输中';
 //break;
case 4:
 return '已签收';
 //break;
case 5:
 return '已取消';
 //break;
default:
 return '无法追踪';
}
}

练习:创建函数isRun,传递任意一个年份,返回是否为闰年(布尔型的值)

2.变量的作用域

局部变量:在函数内的作用域称为函数作用域,里边的变量就是局部变量

全局变量:在函数外的作用域称为全局作用域,默认一个js文件下就是在一个全局作用域下,里边的变量就是全局变量

局部变量只能在当前的函数作用域下访问到,全局变量可以在任意的作用域下访问到

在函数中不加var声明的变量是全局变量 —— 不推荐

变量提升,程序执行前,将var声明的变量提升到所在作用域的最前边,赋值不提升

3.函数的作用域

全局函数:在*全局作用域*下创建的函数,可以在任意作用域下调用

局部函数:在*函数作用域*下创建的函数,只能在所在的函数下调用

函数提升:程序执行前,会将函数*整体提升*到所在作用域的最前边

4.递归

是在函数内调用自身这个函数

递归的使用:要有边界条件(跳出条件或者循环次数),否则是死循环

结合着return

递归解决的是循环的问题。

var count=0;
function say(){
 console.log('从前有座山');
 count++;
 if(count===3){
//跳出函数,结束函数
   return 3;
}
 return say();  //函数内部调用自身
}

5.匿名函数

function (){ }

(1)创建函数
函数声明function fn(){ }
函数表达式var fun=function(){ }

*函数名称**(**)**函数名称*的区别

函数名称() 调用函数,执行一次函数体中的代码,得到返回值

函数名称 代表一个变量,保存了一个函数

练习:使用函数表达式创建函数getSum,计算任意两个数字之间所有整数的和

*对比函数声明和函数表达式的区别*

函数声明存在函数的整体提升,可以先写调用再写创建

函数表达式不存在函数提升,必须先写创建再写调用

//var c=function(){}var c=3;function c(){ console.log(2);}c(); //报错,c不是一个函数

(2)匿名函数自调用

(function(形参列表){ //函数作用域,里边的变量都是局部的,防止全局污染})(实参列表);

(function(a,b){
 console.log(a+b);
})(3,5);
(3)回调函数

回调函数是将一个函数(函数名称或者匿名函数)以实参的形式传递

1. 将函数名称以实参的形式传递到函数内部
function tao(madai){   //madai为函数名字,传递函数名后,函数内部可调用
 console.log('涛哥开始跑第1棒');
 console.log('涛哥到达第1棒终点');
 //调用传递进来的回调函数
 madai();
}
?
2.将匿名函数以实参的形式传递进入函数
tao( function(){
 console.log('陌生人开始跑...');
} );

function tao(madai){ madai(); //调用传递进来的回调函数}function dong(){ }tao( *dong* )tao( function(){ } )

6.系统函数(全局函数)

parseInt/parseFloat/Number

isNaN() 检测一个值转数值后是否为NaN,如果是返回true,不是返回false

isFinite() 检测一个值是否为有限值,如果是返回true,不是返回false(判断一个值是否是无穷大)

只有无穷是无限值,其它都是有限值

3/0 // Infinity 无限值

eval() 执行字符串表达式

encodeURI() 对应网址中的中文编码

decodeURI() 对用中文解码

var str = "http://www.jd.com/search?kw=电脑"
var str2 = encodeURI(str)    中文编码
var str3 = decodeURI(str2)   对用中文解码

7.对象

对象属于引用类型的数据

对象是一组属性和方法的集合,具体到某一个

一部手机属性有品牌、型号、颜色、尺寸、内存大小、cpu... 方法有聊天、玩游戏、看视频、办公、学习...

涛哥属性有身高、体重、发色、肤色、户籍... 方法有摊煎饼、养兔子、敲代码、接力赛...

万物皆对象

7.1JS中的对象

自定义对象,程序员创建的对象

内置对象,JS提供的对象

宿主对象,根据不同的执行环境划分

7.2自定义对象创建方式

对象字面量 {}

内置构造函数 new Object()

自定义构造函数

7.3对象字面量

{ 属性名1:属性值1, 属性名2: 属性值2.... }

//对象字面量
var phone={
  brand:'华为',  //属性名可不加引号,但是若是有特殊符号(不符合变量命名规则的)必须加引号
  color:'黑色',
  'size':6.3,
  '2cpu': '麒麟9900'
};

访问属性方式:
 对象.属性名    phone.brand

 对象[ '属性名' ]  phone["brand"]

 如果属性名不存在则返回undefined

修改属性值:
phone.color = "白色"
phone["brand"] = "vivo"
添加一个不存在的属性
phone.num="P30";
phone["num"]="P30";

属性名的引号可以省略,如果含有特殊字符必须加加引号

7.4属性的访问

对象.属性名

对象[ '属性名' ]

如果属性名不存在则返回undefined

7.5内置构造函数创建对象

new Object() 返回一个空对象,需要单独的添加每个属性或者方法

使用new调用的函数称为构造函数,返回一个对象。

练习:创建一个员工的对象,包含的属性有编号,姓名,性别,工资

//内置构造函数
//练习:创建一个员工的对象,包含的属性有编号,姓名,性别,工资
var emp=new Object();   //{}
emp.eid=1;
emp.ename='涛哥';
emp['sex']='男';
emp['salary']=45000;
//console.log(emp);
7.6遍历属性

依次访问对象中的每个属性

for(var k in 对象){ k 每一次获取的属性名 对象[k] 属性名对应的属性值}

//遍历属性
//for-in循环
for(var k in emp){
  //k每次获取的属性名
  console.log(k,emp[k]);
}

7.7 判断对象属性是否存在

//练习:创建一个商品对象,包含属性有标题、价格,如果价格存在,在当前基础之上打九折,如果产地属性不存在,添加该属性;最后打印对象
var laptop={
 title:'小米Air',
 price:4300
};
//如果存在   判断方法1:使用hasOwnPropertity方法判断
if( laptop.hasOwnProperty('price') ){
 laptop.price*=0.9;
}
//如果不存在 判断方法2:使用对象.属性的值和undefined对比,true为没有该属性,false为有这个属性
if( laptop.madeIn===undefined ){
 laptop.madeIn='中国';
}
console.log(laptop);
?
//判断方法3 使用 “属性名” in 对象名   存在返回true,不存在返回false
console.log("title" in laptop)

7.7对象的成员方法

var person={
 name:'涛哥', //成员属性
 play:function(){ //成员方法
//this指的是当前调用方法的对象
   console.log(this.name+'正在玩单杠');
},
 tan:function(){
   console.log(this.name+'正在摊煎饼');
}
};
//console.log(person);
//调用
//person.play();
//person.tan();

7.7 对象的引用

 //销毁引用类型数据,释放内存空间
tao=null;//空地址
?
dong=null;//空地址