谈谈 JavaScript 的函数表达式及其应用

ColdeLargie 7年前
   <p>我们都知道定义函数的方式有两种,一种是 <strong>函数声明</strong> ,另外一种就是 <strong>函数表达式</strong> 。</p>    <h2>函数声明</h2>    <p>语法为:function关键字后跟函数名。例如:</p>    <pre>  <code class="language-javascript">function functionName(arg0) {      //函数体  }  alert(functionName.name)  // "functionName"</code></pre>    <p>函数声明最主要的特征就是 <strong>函数声明的提升</strong> ,所以我们可以把函数声明放在调用它的语句的后面,因为执行代码前会先读取函数声明。比如:</p>    <pre>  <code class="language-javascript">hello();  function hello(){      alert("hello");  }</code></pre>    <p>上面的代码可以在浏览器正常运行。</p>    <h2>函数表达式</h2>    <p>语法如下:</p>    <pre>  <code class="language-javascript">var functionName = function(arg0){      //函数体  };  alert(functionName.name)  // ""</code></pre>    <p>如上所示当我们输出函数名时返回了空字符串,因为function关键字后面没有标识符,这种情况下创建的函数为匿名函数。接下来我们就谈谈利用函数表达式所创建的匿名函数有什么应用。</p>    <h2>应用</h2>    <p>函数表达式最典型的应用就是模仿块级作用域,我们都知道JavaScript没有块级作用域,不过我们可以用函数表达式模仿块级作用域。形成独立作用域,从而 <strong>避免全局污染</strong> 。</p>    <p>操作方法:声明匿名函数,立马调用。</p>    <p>最经典的例子:</p>    <pre>  <code class="language-javascript">function createFunctions(){      var result = [];      for (var i=0; i < 10; i++){          result[i] = function(){              return i;          };      }      return result;  }  createFunctions();</code></pre>    <p>乍一看每个函数都应该返回自己的索引值,即位置0的函数返回0,1的返回1,以此类推。实际上每个函数都将返回10,因为这里的i是贯穿整个作用域的,我们把上面代码修改一下:</p>    <pre>  <code class="language-javascript">//写法1  (function(){      //这里是块级作用域      var result = [];      for(var i=0;i<10;i++){          result[i] = (function(num){              return function(){                  return num;              };          }(i))();      }      return result;  })();   //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  //写法2  var hasfunction = function(){      var result = [];          for(var i=0;i<10;i++){              result[i] = (function(num){                  return function(){                      return num;              };          }(i))();      }      return result;  }  hasfunction();</code></pre>    <p>在立即执行函数执行的时候,i的值被赋值给num,同时创建返回num的闭包,从而result数组每个函数都有一个num变量的副本。</p>    <p>完。</p>    <p> </p>    <p>来自:https://segmentfault.com/a/1190000007393641</p>    <p> </p>