zoukankan      html  css  js  c++  java
  • if与立即执行函数(IIFE)里面的变量提升

    今天遇到一道笔试题,题目是这样的

    f = function() {return true;}; 
    g = function() {return false;}; 
    (function() { 
       if (g() && [] == ![]) { 
          f = function f() {return false;}; 
          function g() {return true;} 
       } 
    })(); 
    alert(f()); // true or false ? 

    直接粘贴到浏览器运行会报错

    g is not a function
    

      奇怪了,按理说,就算外部g被覆盖,function的声明方式也应该是提升并立即赋值的,我决定重新梳理一下这方面的知识

    二、实验

            console.log(bar); // undefined
            console.log(foo); // error: foo is not defined
            if(true){
                foo = 'foo';
                function bar(){
                    return 'bar';
                }
            }

      如果我们给if中的foo加上var关键字

    console.log(bar); // undefined  IE11之前都会把bar赋值好
    console.log(foo); // undefined
    if(true){
      var foo = 'foo';
      function bar(){
         return 'bar';
      }
    }

    说明IE11之后(至多在firefox55,chorme60之后),if 里面的 var 和 function的声明方式,都会存在变量提升,但是并不赋值

    在立即执行函数里面呢

            console.log(bar); //  error: bar is not defined
            console.log(foo); //  error: foo is not defined
            (function(){
                foo = 'foo';
                function bar(){
                    return 'bar';
                }
            }())

    无论是各个版本的IE还是chrome,firefox都报错,说明 立即执行函数是一个函数作用域

    我们在回过头来看这道题

    f = function() {return true;}; 
    g = function() {return false;}; 
    (function() { 
       if (g() && [] == ![]) { 
          f = function f() {return false;};  // 还是外部的 f
          function g() {return true;} // 变量提升,但是不赋值,并且覆盖外部 g
       } 
    })(); 
    alert(f()); // IE11以前返回false
  • 相关阅读:
    String前后去掉空格、option只能定义value值吗?还能添加什么值。dom和Jquery对象转换。
    JsonObject没有fromObject、idea引入maven有红线没依赖、JsonObject maven 依赖包
    json几个小例子
    [极客大挑战 2019]PHP1
    栈溢出原理笔记(一)
    CentOS7怎么安装图形界面
    快速搭建WordPress博客
    Mac 安装Mysql 之 Sqlservice 区别
    Metasploit-初篇
    Windows To Go 制作详解
  • 原文地址:https://www.cnblogs.com/lastnigtic/p/7500491.html
Copyright © 2011-2022 走看看