zoukankan      html  css  js  c++  java
  • 一个经典的js中关于块级作用域和声明提升的问题

    function functions(flag) {
        if (flag) {
          function getValue() { return 'a'; }
        } else {
          function getValue() { return 'b'; }
        }
    
        return getValue();
    }
    console.log(function functions(true));
    

    请问这段代码会输出什么呢。

    答案将永远是:b。

    解释一下为什么,因为在js是没有块级作用域的,又因为函数声明提升的原因,上面的这段代码变相当于:

    function functions(flag) {
        function getValue(){return 'a'};
        function getValue(){return 'b'};
        if (flag) {
          ....
        } else {
          ....
        }
    
        return getValue();
    }
    

    因此无论flag为何值,返回的方法始终为重写后的方法。

    那么怎么才能解决这个问题呢...

    function functions(flag) {
        if (flag) {
          var getValue = function () { return 'a'; }
        } else {
          var getValue = function () { return 'b'; }
        }
        return getValue();
    }

    不再用函数声明,而是用函数表达式的方法,因为函数表达式不会提升,因此只有当逻辑只想到这儿的时候才会执行。所以就解决问题啦。

  • 相关阅读:
    opencv实现录屏
    numpy.where() 用法详解
    spring 配置quartz定时任务及时间设置
    http网络请求 返回不同的状态码
    28行代码带你理解机器学习原理
    sigmoid函数
    numpy运算简介(二)
    数论代码整理
    数论整理
    树状数组
  • 原文地址:https://www.cnblogs.com/qqqiangqiang/p/5755665.html
Copyright © 2011-2022 走看看