javascript函数表达式

来源:互联网 发布:linux 物理网卡 编辑:程序博客网 时间:2024/06/05 03:35

1、函数声明与函数表达式的差异之一:声明可以在被声明之前调用,由于函数声明提升的原因,而函数表达式可以看做是普通变量,因为不能在声明之前引用。

<!doctype><html><head><meta charset="UTF8"></head><script type="text/javascript">    function a(){    }    console.log(a.name);//获取函数名称,在chrome、Safari、Firefox和opera中有效    //函数提升会导致一些意想不到的结果,如下所示    var condition = true;    if(condition){        function b(){            console.log(true);        }    }    else{        function b(){            console.log(false);//一般来说无论condition是true还是false,都会保留后一个        }    }    b();    //如果是函数表达式则没有任何问题,因为函数表达式不会被提升,如下    if(condition){        var c = function(){            console.log(true);        }    }    else{        var c = function(){            console.log(false);        }    }    c();    //函数的递归调用    function d(num){        if(num == 1){            return num;        }        else{            return num * arguments.callee(num-1);            //此处尽量不要使用函数名,防止当函数名发生变化时,出现错误,但是在严格模式下不允许使用callee        }    }    console.log(d(4));    //更靠谱的递归函数,适用于严格模式    var d = (function f(num){        if(num == 1){            return 1;        }        else{            return num * f(num - 1);        }    });    console.log(d(4))    //函数的闭包,有权访问另一函数作用域的函数    function e(name){        return function(){            console.log(name);        }    }    var g = e('guoxiaofen');    g();//被闭包的函数,在父函数结束后,仍能访问其中的变量    g = null;//取消对匿名函数的引用,以便释放内存    //请注意闭包只能取得函数变量的最后一个值    function create(){        var result = new Array();        for(var i = 0 ;i < 10;i++){            result[i] = function(){                console.log('running' + i);                return i;            }        }        console.log('create finish');        return result;    }    var result = create();    console.log(result[1]());//10    console.log(result[4]());//10,请注意只会记录父函数的最后一个值    //修正方法:    function create1(){        var result = new Array();        for(var i = 0 ;i < 10;i++){            result[i] = function(num){//将i复制一份存入临时参数num中                return function(){                    return num;                };            }(i);        }        console.log('create finish');        return result;    }    result = create1();    console.log(result[1]());//1    console.log(result[4]());//4    //关于闭包的this对象    var name = 'the window';    var o ={        name :'my o',        sayName : function(){            return function(){                return this.name;            }        }    }    var say = o.sayName();    console.log(say());//the window,函数被调用时自动取得this和arguments对象,    // 搜索这两个变量时,搜索到当前活动对象为止,即global对象,而不是外部闭包对象    var o1 ={        name :'my o1',        sayName : function(){            var that = this;            return function(){                return that.name;            }        }    }    console.log( o1.sayName()());    //意外的改变this值    var person = {        name:'Andy',        sayName:function(){            return this.name;        }    }    console.log(person.sayName());//Andy    console.log((person.sayName)());//Andy    console.log((person.sayName=person.sayName)());//the window    //Dom元素导致的内存泄露    //用闭包函数模仿块级作用域    function output(num){        (function(){            for(var i = 0;i<num;i++){                console.log(i);            }        })();//        console.log(i);//undefined    }    output(2);    //利用闭包定义私有变量,name修改只能通过get或者set函数访问    var highPerson = function(name){        this.getName = function(){            return name;        };        this.setName = function(value){            name = value;        }    }    var Andy = new highPerson('Andy');    console.log(Andy.getName());    Andy.setName('guo');    console.log(Andy.getName());    //</script></html>


0 0