javaScript_Function
来源:互联网 发布:哒哒abc少儿英语 知乎 编辑:程序博客网 时间:2024/06/17 17:21
函数基础
定义
函数声明
-执行代码之前会先读取函数声明,无先后区别
sayHi();//hifunction sayHi(){ alert("hi");}
函数表达式
-使用前必须赋值,有先后区别
var sayHi=function(){ alert("hi");};sayHi();//hi
不推荐,最后一个参数始终被看成函数体
var sum=new Function("num1","num2","return num1+num2");console.log(sum(10,20));
匿名函数
-又名拉姆达函数(lambda)
-function关键字后面没有表示符
-匿名函数对象的name属性是空字符串
-匿名函数可以当值使用
函数当返回值
function createComparisonFuncton(propertyName){ return function(object1,object2){ var value1=object1[propertyName]; var value2=object2[propertyName]; if(value1<value2){return -1;} else if(value1>value2){return 1;} else{return 0;} };}
参数
-多出的实参会忽略
访问参数
-arguments属性以数组形式保存参数列表
var test=function(){console.log(arguments[0])};test(10,20);//10
—————————————————————————–
闭包
-有权限访问另一函数作用域中的变量的函数
-常见方式,函数内部创建另外一个函数
function createComparisonFuncton(propertyName){ return function(object1,object2){ var value1=object1[propertyName]; var value2=object2[propertyName]; if(value1<value2){return -1;} else if(value1>value2){return 1;} else{return 0;} };}
作用域链
-每个执行环境都有变量对象用于表示变量
-调用函数时,会创建运行期上下文的内部对象(execution context)
-execution context的作用域链[scope chain]初始化为指向当前运回函数的[scope chain]
-[scope chain]保存各个对象作用域指针列表
-[scope chain]的[[scope]]指向各变量对象(函数作用域)包括,活动对象,全局对象,父级对象
-活动对象包括函数内部的局部变量和函数参数
-虚拟属性,不能访问
-同一父作用域中的闭包拥有一个相同的[[scope]]属性
var fun1;//fun0执行后,fun1作用域链中引用了fun0,fun0不会消亡(function(){ fun1=function(){console.log("i am fun1");};})();fun1();
闭包与变量
-闭包保存的是整个变量对象而不是某个特殊的变量
no copy
function createFunction(){ var result=new Array(); for(var i=0;i<10;++){ result[i]=function(){return i;}; } return result;}var a=createFunction();for(var i=0;i<10;i++){console.log(a[i]());}//10*10
has copy
function createFunction(){ var result=new Array(); for(var i=0;i<10;++){ result[i]=function(num){return function(){return num;};}(i); } return result;}var a=createFunction();for(var i=0;i<10;i++){console.log(a[i]());}//0,1,...,9
—————————————————————————–
小点
递归
-函数通过名字调用自身的情况下构成
function factorial(num){ if(num<=1){return 1;} else{return num*factorial(num-1);}}var anotherFactorial=factorial;factoral=null;alert(anotherFactorial(4));//出错,factoral已消亡
递归函数的赋值
-arguments.callee
-指向正在执行的函数的指针
-严格模式不通过,可以使用命名函数表达式
非严格模式下
function factorial(num){ if(num<=1){return 1;} else{return num*arguments.callee(num-1);}}var anotherFactorial=factorial;factoral=null;alert(anotherFactorial(4));
严格模式下和非严格模式均正常
var factorial=(function f(num){ if(num<=1){return 1;} else{return num*f(num-1);}});
this对象
-在全局函数中,this指向window
-函数当做某个对象的方法时候,this指向那个对象
window中
var name="zzz";console.log(name);//zzzconsole.log(this.name);//zzz
当做某个对象的方法时候
var o=new Object();o.name="zzz";o.getName=function(){console.log(this.name);};o.getName();//zzz
内存泄漏
-闭包的作用域链中保存这一个HTML元素,那么就意味着该元素将无法销毁
只要匿名函数存在,element的引用数至少也说1,所沿用内存永远不被回收
function handler(){ var element=document.getElementById("someElement"); element.onclick=function(){alert(element.id);};}
解决
function handler(){ var element=document.getElementById("someElement"); var id=element.id; element.onclick=function(){alert(id);}; element=null;}
模仿块级作用域
-javaScript没有块级概念
-不限制多次声明,对后续声明不初始化
(function(){ for(var i=0;i<10;i++){ alert(i); }})();alert(i);//导致错误
私有变量
-javaScript没有私有成员的概念
function MyObject(){ //私有变量 var name='zzz'; //public特权方法 this.name="this_zzz"; this.getName=function(){alert(name);};//访问私有变量 this.getName=function(){alert(this.name);};//访问公有变量}
静态私有变量
-所有实例共享
(function(){ var age=10; object=function(){}; object.prototype.getAge=function(){alert(age);};})();
模块模式 单例
-只有一个实例的对象
var singleton=function(){ //私有变量 var name="zzz"; var age=10; //特权 return {work:doctor,getName:function(){alert(name);},gerAge(){alert(age);}};};
增强模块模式
-适合某些单例必须说某种类型的实例
var singleton=functon(){ //私有变量 var name="zzz"; var age=10; //创建对象 var object=new CustomType(); //添加特权 object.getName=function(){console.log(name);}; //返回对象 return object;};
涉及属性
目录
用 [TOC]
来生成目录:
- 函数基础
- 定义
- 函数声明
- 函数表达式
- 匿名函数
- 函数当返回值
- 参数
- 访问参数
- 定义
- 闭包
- 作用域链
- 闭包与变量
- 小点
- 递归
- 递归函数的赋值
- this对象
- 内存泄漏
- 模仿块级作用域
- 私有变量
- 静态私有变量
- 模块模式 单例
- 增强模块模式
- 递归
- 涉及属性
- 目录
- javaScript_Function
- javascript_function方法中的arguments
- RNN-RBM网络介绍及代码分析
- 【Android】Android防止过快点击造成多次事件执行(防止按钮重复点击)
- php之redis安装与使用
- Nginx搭建Tomcat集群和完成负载均衡
- HDU 6058 Kanade's sum 思维+ 模拟链表
- javaScript_Function
- NKOJ 4043 (CQOI 2017) 老C的键盘 (树形DP)
- Java String转换date类型
- PrototypeGridProgressbar——类似汽车油表的自定义控件
- openCV学习之路【1】---VS2015+openCV3.2.0配置教程
- 从零开始学JAVA WEB(2)——项目选取
- 生活中的状态模式——水之三态
- vue中v-if和v-show的区别
- js 回调函数理解