函数

121 阅读4分钟

对象:任意值的集合。

集合中一般以键值对形式存放值

var cat = {
   'name':'Tom',
    'age':4,
    'family':['father','mom'],
     'speak':function(){
         console.log('喵喵~');
      },
      'friend':{
         'name':'Jerry',
          'age':4
       }
}

对象可以减少全局变量的定义

如何创建对象

  • 字面量创建对象,如上

  • 构造函数创建对象 

    varcat = new Object();

  • Es5 原生提供的方法  Object.create()

如何修改对象属性

cat.name ='Tim'

cat['name'] = 'Tim'

如何增加属性

cat.type =‘加菲猫’

删除属性

delete cat.type

检测对象是否拥有某一个属性

‘name' in cat //in
for in for(var p in cat){  //这种写法表示将cat中的每一个属性名赋值给p
console.log(cat.p); //undefined
console.log(cat["p"]) 相当于cat.p //在这里p是作为一个属性名
console.log(cat[p]); //能够打印出来所有的属性
支持这么写:console.log(cat['n' +'mae'//不建议
}

什么是函数

一次封装,多次调用

function--关键字告诉解析器声明函数 

函数名在调用时区分函数

匿名函数

window.onload = function(){

页面加载完执行的逻辑

}

参数以逗号分割,js的传参跟定义的时候个数可以不一致

参数属于局部变量

return 函数结束 返回值

函数和调用的时候发生了什么

创造作用域 传参执行代码

函数执行完函数作用域以及在函数作用域中的变量都会被销毁

为什么要使用函数

1.复用代码 (太多相似和相同的代码)

2.统一修改与维护

3.增加程序的可读性 (在程序中暴露了太多细节就应该用函数,这样读程序直接读方法就好了)

注意:函数如果没有返回值会返回undefied

函数的本质

1.函数可以被调用

2.函数是对象,所以函数上也可以添加属性和方法

字面量定义:function add(){}  

var add = function(){}

构造函数:var add =

Function(‘num1‘,'num2‘,“return num1+num2"); //以字符串形式传递

作为数据值使用

var add = function (){

}

add();

函数可以存在数组和对象中

函数可以作为参数:如定时器

setTimeout(fn,1000);

function fn(){console.log(1)}

函数可以作为返回值

function fn(){

return function(){

console.log(1)

}

fn()();

函数定义方式的区别

构造函数的形式比较臃肿

字面量形式的函数表达式是一个语句要用函数结束

//预解析时不同

以var 赋值表达式形式声明函数

解析时会为undefined 所以调用要放在函数表达式后面

普通函数的调用

add(){}

匿名函数的调用

var add = function(){}(); add();

function(){}()//会被认为是函数声明

var add = function(){}();

(function (){})() 相当于 (function(){})()

~ + - ! 打头都可以

递归调用,注意终止条件

docunment.onclick()//模拟点击

对于不合法函数变量,要加隐号:person'@‘,中括号的形式访问属性的方式比较强大

链式调用:想要能够使你的方法能够进行链式调用的话需要返回函数的挂载对象

构造函数的调用

方便区分构造函数还有普通函数会以大小写区别定义,真正的区别在于调用

function add(){}; add();
function Add(); new Add();  //构造函数必须通过new实例化调用,实例化构造函数返回对象

函数的间接调用

每个函数都有call\apply

function add(num1,num2){
return num1+num2
}

add.call(window,1,2); 
add.apply(window,[1,2]);
//改变this指向,继承父类方法,判断类型,方便传参apply可以直接传数组还有类数组

参数类型

引用类型的参数不可以随意修改

形参:占位符 局部变量

实参:替换形参进行实际计算

参数个数

形参与实参个数相等

实参少于形参,可选参数

实参大于形参

arguments 是类数组 

arguments.callee 相当于函数本身,一般用在递归中,不过严格模式下不能使用callee

有另一种方法:

var jiecheng = function fn (num){
   if(num<=1) return 1;
   return num *fn(num-1);
}

函数名.length 能够取得形参的个数

arguments.length 能够取得实参的个数

throw new Error("");

什么可以做参数

参数可以为空

函数中函数使用外侧函数变量

数字、字符串、布尔值、数组、对象、函数

$.each([1,2,3],function(index,item){});

continue 跳出本次循环 ,在循环中使用

break 跳出整个循环

什么可以作为返回值

return 是可以直接退出函数

函数没有返回值就是undefined

null,数字、字符串、布尔值、数组、数组、对象、函数

为了写出更好更优雅的函数,会将函数作为参数传到另一个函数中,组成一个新功能的函数再返回复合型功能函数