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;};

涉及属性

name 解析 数据类型 arguments.callee 指向正在执行的函数的指针 引用 arguments 保存传入实参列表 Array

目录

[TOC]来生成目录:

  • 函数基础
    • 定义
      • 函数声明
      • 函数表达式
      • 匿名函数
    • 函数当返回值
    • 参数
      • 访问参数
  • 闭包
    • 作用域链
    • 闭包与变量
  • 小点
    • 递归
      • 递归函数的赋值
    • this对象
    • 内存泄漏
    • 模仿块级作用域
    • 私有变量
    • 静态私有变量
    • 模块模式 单例
    • 增强模块模式
  • 涉及属性
  • 目录

原创粉丝点击