博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数表达式
阅读量:4627 次
发布时间:2019-06-09

本文共 2960 字,大约阅读时间需要 9 分钟。

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

转载于:https://www.cnblogs.com/huoteng/p/4962182.html

你可能感兴趣的文章
带CookieContainer进行post
查看>>
C语言学习笔记--字符串
查看>>
关于七牛进行图片添加文字水印操作小计
查看>>
DataSource数据库的使用
查看>>
Luogu4069 SDOI2016 游戏 树链剖分、李超线段树
查看>>
Java的内部类真的那么难以理解?
查看>>
一文搞懂Java环境,轻松实现Hello World!
查看>>
hash实现锚点平滑滚动定位
查看>>
也谈智能手机游戏开发中的分辨率自适应问题
查看>>
关于 IOS 发布的点点滴滴记录(一)
查看>>
vue+element-ui实现表格checkbox单选
查看>>
[周记]8.7~8.16
查看>>
递归定义
查看>>
kindeditor 代码高亮设置
查看>>
图的邻接表存储
查看>>
2018 leetcode
查看>>
PHP中获取当前页面的完整URL
查看>>
Chapter 4 Syntax Analysis
查看>>
vi/vim使用
查看>>
讨论Spring整合Mybatis时一级缓存失效得问题
查看>>