zoukankan      html  css  js  c++  java
  • 也谈自执行函数

    立即执行函数的定义
    下面来看一个立即执行函数的例子:
    var immediate_one = function() {
      return 1;
    }();
    console.log(immediate_one) ; //1
    这里可以看到,通过一个一次性函数,它自动运行并且返回一个值,然后赋值给immediate_one
    如果,把代码改成如下:
    var immediate_one = function() {
      return 1;
    }
    那么immediate应该是一个函数,而不是一个函数的返回值了,并且他不会执行,这只不过是一个函数表达式的定义而已了。
    但是如下的写法确实错误的:
    function myfunc() {
      return 1;
    }();
    我们在Firefox控制台打印会报如下的错误:
    这是因为myfunc是使用函数声明语法定义的,而不是函数表达式语法。二者之间的区别有时候不是很显著,除非你考虑到代码在程序中位于何处。可以将该函数作为有一个操作数传递给分组操作符圆括号,从而可以修正这个语法错误:
    (function myfunc() {
      return 1;
    })();
    我们需要做的只是把函数包含到圆括号里面,这有何区别呢?在这个例子中,函数不再是位于主程序代码中,而是作为一个操作数传递给一个分组操作符(),他直接返回该函数。这将函数声明转换成了函数表达式,并且后面()执行了该函数。函数声明是不能作为操作数的,因此,解析器消除了该语法的歧异,并且将这个函数当做一个函数表达式对待。向下面这样放置分组运算符圆括号也是有效的:
    (function myfunc() {
      return 1;
    }())
     
    立即执行函数的作用
     
    a.用来初始化
    立即执行函数的一种用法是,进行一次性初始化。通常,你想要进行一些初始化,而又不会遗留下全局变量。如果这一初始化过程足够复杂,以至于需要临时变量,可以将所有的代码放到立即执行函数里面,让该函数为你执行清理工作。
    如下代码是将单击事件处理程序分配给按钮,这是一种很好的选择:
    (function() {
      for(var i = 1; i <= 3; i++) {
        document.getElementById("button-" + i).onclick = function() {
          //事件处理的逻辑代码写在这里
        }
      }
    }());
    如果不用立即执行函数,变量i将保留在全局作用域里面,会污染作用域。
     
    b.实现私有性
    立即执行函数也可以实现私有性。你可以让全局函数定义在其他函数的闭包中,并且共享这个闭包的本地作用域。
    如下是一个简单的迭代器的实现:
    var next, previous, rewind;
     
    (function(){
     
      var index = -1,
        data = ["eeny", "meeny", "miny", "moe"],
        count = data.length;
     
      next = function() {
        if(index < count) {
          index++;
        }
        return data[index];
      }
     
      previous = function() {
        if(index >= 0) {
          index--;
        }
        return data[index];
      }
     
      rewind = function() {
        index = -1;
      }
    }());
    console.log(next()); //eeny
    console.log(previous()); //undefined
    console.log(next()); //eeny
    console.log(next()); //meeny
    这个例子中,inde,data,count是私有的, 因为这个迭代器的用户只需要向前走或者向后走的方法,并且可能不会访问数据和指针,他们不会决心把数据和指针搞乱。
  • 相关阅读:
    UML类图学习总结
    Java和C# RSA加解密相互通信和使用公钥加密传输
    C#des加密算法指定键的大小对于此算法无效
    WCF--找不到具有绑定 BasicHttpBinding 的终结点的与方案 https 匹配的基址。注册的基址方案是 [http]。
    IIS7 使用server farms 进行负载均衡
    iis7 未注册framework4 导致 莫名的404错误
    启用代理导致 有道云笔记未知错误、网络错误和OneDrive断线
    AspNetCore发布到Centos7
    c# 操作临时数据---XML操作
    c# 获取程序目录
  • 原文地址:https://www.cnblogs.com/yugege/p/5138606.html
Copyright © 2011-2022 走看看