• 模仿块级作用域


    模仿块级作用域

    JavaScript中没有块级作用域,这意为着在块语句中定义的变量,实际上是包含在函数中而非语句中创建的。

    下面的这个实例可以看出:

    function outputNumbers(count){
        for (var i=0; i < count; i++){
            alert(i);
        }
    
        alert(i);   //count
    }
    
    outputNumbers(5);//0 1 2 3 4    5(for块语句外输出的)
    

    虽然没有块级作用域,但是可以通过匿名函数来模仿块级作用域

    用作块级作用域(通常称为私有作用域)的匿名函数语法如下表示:

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

    以上代码定义并立即调用了一个匿名函数。将函数申明包含在一对圆括号中,表示它实际上是一个函数表达式。

    注意,下面这种写法会出错

    //错误写法
    function(){
        //这里是块级作用域
    }();
    

    如果一条语句是以function关键字开始,那么这段会被JavaScript解析器认为是函数定义。而函数定义是不能被立即执行的,因此就必须有一个办法,使解析器可以将之识别为函数表达式。因为解析器识别函数定义的条件是以function关键字开始,那么只要在function关键字的前面有任何其他的元素,就会从函数定义转变为函数表达式,所以当我们在其前面填括号就会变成函数表达式了。

    下面这种写法也可以:

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

    现在让我们重新写开头的那个实例:

    function outputNumbers(count){
                
        (function () {
            for (var i=0; i < count; i++){
                alert(i);
            }
        })();
                    
        alert(i);   //ReferenceError: i is not defined,出现错误了
    
    outputNumbers(5);//0 1 2 3 4
    

    总结:无论在什么地方,只要临时需要使用变量,就可以使用私有作用域,通过创建私有作用域,每个人都可以使用自己的变量,又不用担心污染全局作用域。

  • 相关阅读:
    Android AsyncTask
    android 自定义 view 和 ViewGroup
    Android Acitivity 生命周期
    Android Service 与 IntentService
    Android LocalBroadcastManager 与 BroadcastReceiver
    如何提升 service 等级,不被kill(整合)
    Android 插件开发,做成动态加载
    新提交审核app保留检查更新入口将被拒绝(读取App Store 版本号的)
    Android: Service中创建窗口显示
    如何升级PowerShell
  • 原文地址:https://www.cnblogs.com/YeChing/p/6361497.html
Copyright © 2020-2023  润新知