zoukankan      html  css  js  c++  java
  • 关于闭包的应用

    JQuery是一个很明显的自执行闭包的例子

    如: //无参数的 
     (function(){ 
        alert('hello'); 
     })(); 

     //有参数的 
     (function(name){ 
        alert('Hello ' + name); 
     })('world'); 

    这个闭包有什么用呢?一眼望去就是括号围着,局部变量想跑也不出来到处捣乱,这是其中一个主要用途,当然了,封装一些javascript库也离不开它。

    ------------------------------------------------------

    1.//将自身传进方法,然后实现了方法的扩展,有点象零件组装啊

    var blogModule = (function (my) {
     my.AddPhoto = function () {
    //添加内部代码
     };
     return my;
    }(blogModule));

     --------------------------------------

    2//好处就是可以调用以前的方法。

    var blogModule = (function (my) {var oldAddPhotoMethod = my.AddPhoto;
     my.AddPhoto = function () {  // 重载方法,依然可通过oldAddPhotoMethod调用旧的方 }; return my;}(blogModule));

    ----------------------------------------------

    3//克隆与继承

    var blogModule = (function (old) { var my = {}, key; for (key in old) { if (old.hasOwnProperty(key)) { my[key] = old[key]; } } var oldAddPhotoMethod = old.AddPhoto; my.AddPhoto = function () { // 克隆以后,进行了重写,当然也可以继续调用oldAddPhotoMethod }; return my; } (blogModule));

    ------------------------------------------

    4.//跨文件共享私有对象

    blogModule._seal()上锁,_unseal() 开锁,实现内部变量的私有化。我认为这样实现并不是最好的,但是我们可以学习下这个开锁闭锁的功能。

    var blogModule = (function (my) { var _private = my._private = my._private || {}, _seal = my._seal = my._seal || function () { delete my._private; delete my._seal; delete my._unseal; }, _unseal = my._unseal = my._unseal || function () { my._private = _private; my._seal = _seal; my._unseal = _unseal; }; return my; } (blogModule || {}));

    二。

    深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解 (http://www.jb51.net/article/36600.htm)

    函数表达式

    1、JavaScript中定义函数有2钟方法:

    1-1.函数声明:

    function funcName(arg1,arg2,arg3){
      //函数体
    }

    ①name属性:可读取函数名。非标准,浏览器支持:FF、Chrome、safari、Opera。
    ②函数声明提升:指执行代码之前会先读取函数声明。即函数调用可置于函数声明之前。

    1-2.函数表达式:

    var funcName = function(arg1,arg2,arg3){
      //函数体
    };

    ①匿名函数(anonymous function,或拉姆达函数):function关键字后无标识符,name属性值为空字符串。在把函数当成值使用时,都可用匿名函数。
    ②类似其他表达式,函数表达式使用前需先赋值,故不存在"函数声明提升"那样的作用。
    ③ECMAScript中的无效函数语法:

    if判断中的重复函数声明

    if(condition){
        function sayHi(){
            alert("Hi!");
        }
    } else {
        function sayHi(){
            alert("Yo!");
        }
    }

    浏览器JavaScript引擎修正错误差异:大多浏览器会返回第二个声明,忽略condition;FF则会在condition为true时返回第一个声明。
     使用函数表达式可解决并实现:

    if判断 函数表达式

    var sayHi;
    if(condition){
        sayHi = function(){
            alert("Hi!");
        }
    } else {
        sayHi = function(){
            alert("Yo!");
        }
    }

  • 相关阅读:
    【设计模式】适配器模式
    【设计模式】原型模式
    【设计模式】建造者模式
    【设计模式】抽象工厂模式
    我的稳定的SpingBoot项目依赖
    Vue中使用iconfont
    Vue-兄弟组件传值
    CSS让高度百分百的方案
    css修改overflow滚动条默认样式
    CSS去除input和textarea点击选中框
  • 原文地址:https://www.cnblogs.com/rainbow661314/p/3190825.html
Copyright © 2011-2022 走看看