zoukankan      html  css  js  c++  java
  • 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);
    

      

  • 相关阅读:
    AJPFX总结java开发常用类(包装,数字处理集合等)(三)
    AJPFX总结java开发常用类(包装,数字处理集合等)(二)
    AJPFX总结java开发常用类(包装,数字处理集合等)(一)
    AJPFX关于面向对象之封装,继承,多态 (下)
    AJPFX关于面向对象之封装,继承,多态 (上)
    Android IntentFilter匹配规则
    细说Activity与Task(任务栈)
    androidStudio 打包与混淆
    Android activity之间的跳转和数据传递
    android开发中的 Activity 与 Context 区别与联系
  • 原文地址:https://www.cnblogs.com/yy95/p/6196401.html
Copyright © 2011-2022 走看看