JS温习:基础(三)
2015-12-01 21:01
531 查看
function对象
1 arguments对象
2 Function对象的本质
3 匿名函数
4 闭包
1.Function对象:js中一切都是对象
连函数也是对象
函数名其实是引用函数定义对象的变量
1.arguments对象:
重载:程序中可定义多个相同方法名,不同参数列表的函数
调用者不必区分每个函数的参数
执行时,程序根据传入的参数个数,自动判断选择哪个函数执行
js语法不支持重载!但可用arguments对象模拟重载效果
arguments对象:函数对象内,自动创建的专门接收所有参数值的类数组对象。
arguments[i]:获得传入的下标为i的参数值
arguments.length:获得传入的参数个数!
即使定义了参数变量,arguments对象同样会收到所有参数值
2.函数对象本质:
1.创建函数对象:3种:
1 声明方式:functon 函数名(参数){函数体;return 返回值;}
(预读时,整体提前)
函数名和函数定义都被提前
在调用前后位置定义都行
2 函数直接量:var 函数名=functon(参数){函数体;return 返回值;}
(预读时,仅函数名变量声明会提前,赋值留在原地,函数定义留在本地)
仅函数名变量声明会提前,
函数定义留在本地
必须定义在调用前!
3 使用new创建函数类型对象:
var 函数名=new Function("a","b",...,"函数体");
2.内存中的函数对象
创建函数对象时:同时创建2个对象:
函数对象:函数的定义
作用域链对象:保存了函数对象可用变量的位置的对象(栈)(像数组,有栈的原理
默认第一项指向window对象,所有可用全局变量
调用函数时:又会创建1个新对象:
活动对象:专门保存局部变量的对象
在作用域链对象中追加指向活动对象的引用
调用后:(默认仅释放活动对象)
作用域链中活动对象的引用出栈
活动对象因无人引用而释放
3.匿名函数:定义时,不指定函数名的函数
何时使用:2大用途:
1.匿名函数自调: 定义完,立刻执行,
执行完立刻释放
何时使用:只有确定函数只执行一次时!
如何自调: (function(参数){
函数体
})(参数值);
(预读不提前,自调,在哪创建在哪执行)
自调:定义在哪儿,就在哪执行,不提前
2.匿名函数回调:先将函数作为对象传递给另一个函数
由另一个函数自主决定在需要时调用
何时使用:只要将一个函数对象传递给其他方法调用时
如何回调:直接将匿名函数的声明传入另一个函数中。
eg:arr.sort(function(a,b){return a-b;});
4.闭包:
问题:局部变量和全部变量的缺陷
全局变量:容易全局污染
(谁都能改)
局部变量:无法共享,不能长久保存
既可以共享,长久保存,又不会全局污染---->闭包
解决:3步:闭包三特点:
1.定义外层函数,封装被保护的局部变量
2.定义内层函数,执行对外层函数局部变量的操作
3.外层函数返回内层函数的对象
并且外层函数被调用,结果被保存在全局变量中
何时使用:即反复使用局部变量,又避免全局污染就要用闭包
缺点:比较占内存
(作用:保护局部变量)
1 arguments对象
2 Function对象的本质
3 匿名函数
4 闭包
1.Function对象:js中一切都是对象
连函数也是对象
函数名其实是引用函数定义对象的变量
1.arguments对象:
重载:程序中可定义多个相同方法名,不同参数列表的函数
调用者不必区分每个函数的参数
执行时,程序根据传入的参数个数,自动判断选择哪个函数执行
js语法不支持重载!但可用arguments对象模拟重载效果
arguments对象:函数对象内,自动创建的专门接收所有参数值的类数组对象。
arguments[i]:获得传入的下标为i的参数值
arguments.length:获得传入的参数个数!
即使定义了参数变量,arguments对象同样会收到所有参数值
2.函数对象本质:
1.创建函数对象:3种:
1 声明方式:functon 函数名(参数){函数体;return 返回值;}
(预读时,整体提前)
函数名和函数定义都被提前
在调用前后位置定义都行
2 函数直接量:var 函数名=functon(参数){函数体;return 返回值;}
(预读时,仅函数名变量声明会提前,赋值留在原地,函数定义留在本地)
仅函数名变量声明会提前,
函数定义留在本地
必须定义在调用前!
3 使用new创建函数类型对象:
var 函数名=new Function("a","b",...,"函数体");
2.内存中的函数对象
创建函数对象时:同时创建2个对象:
函数对象:函数的定义
作用域链对象:保存了函数对象可用变量的位置的对象(栈)(像数组,有栈的原理
默认第一项指向window对象,所有可用全局变量
调用函数时:又会创建1个新对象:
活动对象:专门保存局部变量的对象
在作用域链对象中追加指向活动对象的引用
调用后:(默认仅释放活动对象)
作用域链中活动对象的引用出栈
活动对象因无人引用而释放
3.匿名函数:定义时,不指定函数名的函数
何时使用:2大用途:
1.匿名函数自调: 定义完,立刻执行,
执行完立刻释放
何时使用:只有确定函数只执行一次时!
如何自调: (function(参数){
函数体
})(参数值);
(预读不提前,自调,在哪创建在哪执行)
自调:定义在哪儿,就在哪执行,不提前
2.匿名函数回调:先将函数作为对象传递给另一个函数
由另一个函数自主决定在需要时调用
何时使用:只要将一个函数对象传递给其他方法调用时
如何回调:直接将匿名函数的声明传入另一个函数中。
eg:arr.sort(function(a,b){return a-b;});
4.闭包:
问题:局部变量和全部变量的缺陷
全局变量:容易全局污染
(谁都能改)
局部变量:无法共享,不能长久保存
既可以共享,长久保存,又不会全局污染---->闭包
解决:3步:闭包三特点:
1.定义外层函数,封装被保护的局部变量
2.定义内层函数,执行对外层函数局部变量的操作
3.外层函数返回内层函数的对象
并且外层函数被调用,结果被保存在全局变量中
何时使用:即反复使用局部变量,又避免全局污染就要用闭包
缺点:比较占内存
(作用:保护局部变量)
<script> //定义一个取号机函数 // 每调用一次,顺序生成一个永不重复的序号 var getNum; function outer(){ var n=1; function inner(){ return n++; } return inner; } //ICBC getNum=outer(); //getNum-->function inner(){ return n++;} console.log(getNum()); //1 console.log(getNum()); //2 var n=100; //假设有全局污染 console.log(getNum()); //3 不受干扰 console.log(getNum()); //4 //CMCC var getNumCMCC=outer(); console.log(getNumCMCC()); //1 console.log(getNumCMCC()); //2 var n=100; //假设有全局污染 console.log(getNumCMCC()); //3 不受干扰 console.log(getNumCMCC()); //4 </script>
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- JavaScript 各种遍历方式详解
- call/apply/bind 的理解与实例分享
- 如何创建对象以及jQuery中创建对象的方式
- IE8开发人员工具教程(二)
- 在flex中执行一个javascript方法的简单方式