zoukankan      html  css  js  c++  java
  • 函数表达式

    1. 递归

    sayHi();
        function sayHi(){
        alert("Hi!");
    }
    
    sayHi(); //错误:函数还不存在
        var sayHi = function(){
        alert("Hi!");
    };
    
    //不要这样做! 
    if(condition){
        function sayHi(){
            alert("Hi!");
        }
    } else {
        function sayHi(){
            alert("Yo!");
        }
    }
    
    //可以这样做
    var sayHi;
    if(condition){
        sayHi = function(){
            alert("Hi!");
        };
    } else {
        sayHi = function(){
            alert("Yo!");
        };
    }
    
    function factorial(num){
         if (num <= 1){
             return 1;
         } else {
             return num * factorial(num-1);
         }
    }
    
    var anotherFactorial = factorial;
    factorial = null;
    alert(anotherFactorial(4)); //出错!
    
    function factorial(num){
        if (num <= 1){
            return 1;
        } else {
            return num * arguments.callee(num-1);
        }
    }
    
    var factorial = (function f(num){
        if (num <= 1){
            return 1;
        } else {
            return num * f(num-1);
        }
    });
    
    • 函数声明提升;

    2. 闭包

    2.1 闭包与变量

    2.2 关于 this 对象

    2.3 内存泄漏

    3. 模仿块级作用域

    (function(){
        //这里是块级作用域
    })();
    
    function outputNumbers(count){
        (function () {
            for (var i=0; i < count; i++){
                alert(i);
            }
        })();
        alert(i); //导致一个错误!
    }
    
    (function(){
        var now = new Date();
        if (now.getMonth() == 0 && now.getDate() == 1){
            alert("Happy new year!");
        }
    })();
    
    • 这种做法可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。
      只要函数执行完毕,就可以立即销毁其作用域链了。

    4. 私有变量

    //特权方法
    function Person(name){
        this.getName = function(){
            return name;
        };
        this.setName = function (value) {
            name = value;
        };
    }
    var person = new Person("Nicholas");
    alert(person.getName()); //"Nicholas"
    person.setName("Greg");
    alert(person.getName()); //"Greg"
    

    4.1 静态私有变量

    (function(){
        var name = "";
        Person = function(value){
            name = value;
        };
        Person.prototype.getName = function(){
            return name;
        };
        Person.prototype.setName = function (value){
            name = value;
        };
    })();
    var person1 = new Person("Nicholas");
    alert(person1.getName()); //"Nicholas"
    person1.setName("Greg");
    alert(person1.getName()); //"Greg"
    var person2 = new Person("Michael");
    alert(person1.getName()); //"Michael"
    alert(person2.getName()); //"Michael"
    

    4.2 模块模式

    var application = function(){
        //私有变量和函数
        var components = new Array();
        //初始化
        components.push(new BaseComponent());
        //公共
        return {
                getComponentCount : function(){
                return components.length;
            },
            registerComponent : function(component){
                if (typeof component == "object"){
                    components.push(component);
                }
            }
        };
    }();
    

    4.3 增强的模块模式

    var application = function(){
        //私有变量和函数
        var components = new Array();
        //初始化
        components.push(new BaseComponent());
        //创建 application 的一个局部副本
        var app = new BaseComponent();
        //公共接口
        app.getComponentCount = function(){
            return components.length;
        };
        app.registerComponent = function(component){
            if (typeof component == "object"){
                components.push(component);
            }
        };
        //返回这个副本
        return app;
    }();
  • 相关阅读:
    iOS有用的三方库和高效工具记录
    正则表达式
    Exception Type & Exception Code
    信鸽推送(XGPush)
    在vue中使用animate.css
    vue 中父子组件传值:props和$emit
    预编译scss以及scss和less px 转rem
    ES6箭头函数及模版字符串
    移动端页面a input去除点击效果及pc端切换
    vue2搭建简易spa
  • 原文地址:https://www.cnblogs.com/huoteng/p/4962182.html
Copyright © 2011-2022 走看看