• javascript模仿块级作用域(第一篇)


      作用域有词法作用域和块级作用域之分,javascript属于词法作用域,而在java、C++中却是块级作用域。在javascript中,只有函数能够创建作用域,作用域是以function作为边界的。

      先看一段代码:

    function outPut(){
       for(i=0;i<5;i++) {
          console.log(i);//0,1,2,3,4  第一个i
       }
       console.log(i);//5  第二个i
    };

      解释:在java等语言中,for循环这块代码中的i变量将会被销毁,第二个i打印出来就是undefined了,因为它们是块级作用域。如果需要使第二个i无法访问第一个i,就需要模仿块级作用域!

         刚刚我说过,在javascript中,只有函数能够创建作用域,所以块级作用域需用函数去创建。通常的做法是通过匿名函数去实现,如下:

    (function(){     
    //这里是块级作用域 
    })();  

      解释:javascript模仿块级作用域其实非常简单!但是对于一些基础较差的同学可能还是不能很好的理解,我们把它拆开来看。

    var fn=function(){
       //省略一段代码
    };
    fn();

      这是一段非常普通的函数定义和调用的代码。在javascript中,函数是一等对象,所以可以把函数当成值或参数进行传递(题外话:当把函数当成参数放在另外一个函数当中时,就可以实现回调函数),在这里是将匿名函数赋值给变量fn,然后用一个括号()执行函数fn。

      从上面可能我们会想到:直接用匿名函数function(){...}替换fn来执行不就可以了吗?所以就有了下面的代码:

    function(){
    ...        //Uncaught SyntaxError
    }();

      然而这是错误的写法。因为匿名函数仅仅是一个函数声明,函数声明不能够进行函数执行,如果要让它执行怎么办?我们可以通过一些手段让函数声明转变为函数表达式,从而使函数能够执行下去,常见的写法也就是用()括号把匿名函数进行包裹()!

      这种javascript写法其实还有另外一种更加准确的叫法:立即调用的函数表达式(IIFE)。顾名思义:它是一个函数表达式,可以立即执行!下一篇博客我将会更加深入地讲解它。

  • 相关阅读:
    mongodb3.6 query plan机制变更导致慢查询问题排查
    zoj 3822 概率期望dp入门
    poj 4513 吉哥系列故事――完美队形II 最长回文子串
    poj 3974 Palindrome O(n)回文子串(Manacher)算法
    hdu 4405 Aeroplane chess 概率dp入门题
    hdu 5001 walk 概率dp入门题
    hdu 3586 Information Disturbing 树形dp+二分
    hdu 2296 Ring AC自动机+DP
    poj 3691 DNA repair AC自动机+DP
    hdu 1520 Anniversary party 树形dp水题
  • 原文地址:https://www.cnblogs.com/wang-jiang/p/4096303.html
Copyright © 2020-2023  润新知