• Javascript中变量提升的问题(五)


    一、函数声明变量提升

      函数声明具有变量提升的问题,所以在函数被声明之前就可以访问。

    console.log(getValue()); 
    function getValue() { 
         return 'a'; 
    }
    

     需要注意的是现在可以在普通块内部定义函数,不会有变量提升,因为是在执行的时候,才会有函数声明。

    //将方法赋值给一个变量,方法就不会被重写,因此才能得到正确的结果。
    function functions(flag) {
        if (flag) {
          function getValue() { return 'a'; }
        } else {
          function getValue() { return 'b'; }
        }
    
        return getValue();
    }
    console.log( functions(true) );//a

      

    getValue();  //getValue is not a function 
    var flag = true; 
    if (flag) {
          function getValue() { return 'a'; }
    } else {
          function getValue() { return 'b'; }
    }

      

    改成函数表达式的形式如下:

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

     2017-2-7更:

     函数声明提升优先级大于变量声明提升优先级:

        

     函数表达式没有变量提升的过程:

    foo();             
    bar();           
    var foo=function bar(){
        console.log("111");
    }
    

     

     函数表达式等号后面必须为匿名函数,写成上述形式默认等号后面为匿名函数,所以bar找不到,同时函数表达式没有提升的过程所以无法在函数定义之前访问。

    二、var定义的变量,变量提升的问题

    判断window对象中是否函数a1变量,var定义的变量会有变量提升,所以a1实质上是在全局环境中。

    if(!("a1" in window)){
        var a1 = 222;
    }
    alert(a1);//undefined
    

     2017-2-7更:

    (function(){
     a = 5;
     alert(window.a);
     var a = 10;
     alert(a); 
    })();
    

     a是在函数中的一个变量,属于局部变量,全局变量中没有a。

     输出结果: undefined 10

    hello函数中的t没有通过var来定义,被提升到hello函数外面,覆盖了前面定义的t。

    2017-10-6更:

    console.log(a);
    var a = 88; 
    var a = function() {
    console.log(22);
    }
    
    console.log(a);
    function a() {
    console.log(222);
    }
    
    console.log(a);
    

      

  • 相关阅读:
    企业级 SpringBoot 教程 (九)springboot整合Redis
    03 网格系统
    02 表单
    01 排版
    客户端调用webSerices
    sql 一行转多行
    sql 多行转一行
    时间差计算 Stopwatch
    sql 游标
    Linq连接查询
  • 原文地址:https://www.cnblogs.com/yy95/p/6196401.html
Copyright © 2020-2023  润新知