javascript- Uncaught SyntaxError: Identifier * has already been declared

前端 未结 3 1535
盖世英雄少女心
盖世英雄少女心 2020-12-24 07:52
console.log(a) //output:ƒ a(){}
var a = 1;
function a(){};
var a = 10;
console.log(a) //output:10

====================

var a = 1;
i         


        
相关标签:
3条回答
  • 2020-12-24 08:16

    This is surprising as javascript var doesn't respect block scope but functional scope...

    Sure, but you didn't use var for the declaration of a in the block scope. You used a function declaration, which does respect block scopes (otherwise it would be completely invalid code, as in ES5 strict mode).

    It's permissible in javascript to declare same variable twice in the same scope with var as below

    Same applies here. The function declaration in the block uses ES6 declaration semantics (like let or const), which does not allow redeclarations.

    0 讨论(0)
  • 2020-12-24 08:24

    Case 1

    console.log(a) //output:ƒ a(){}
    var a = 1;
    function a(){};
    var a = 10;
    console.log(a) //output:10
    

    Will be rendered as

    var a;
    a = function(){}; // now a holds the value as a function
    console.log(a); // output : f a(){}
    a = 1; // a is a var that holds value 1
    a = 10; // a is a var that holds value 10
    console.log(a); // output : 10
    

    Case 2

    var a = 1;
    if(true){
       function a(){};
       var a = 10;
    }
    console.log(a)
    

    Will be rendered as

    var a;
    a = 1;
    if(true) {
        a = function() {};
        let a; // The function declaration in the block uses ES6 declaration semantics (like let or const), which does not allow re-declarations.
        var a; // throws Uncaught SyntaxError: Identifier 'a' has already been declared
        a = 10;
    }
    console.log(a);
    

    Case 3

    var a = 1;
    if(true){
        function a(){};
        a = 10;
     }
    console.log(a)
    

    Will be rendered as

    var a;
    a = 1;
    if(true) {
        a = function() {};
        let a;
        a = 10;
    }
    console.log(a); // output : f a(){}
    

    Case 4

    var a = 1;
    if(true){
        var a= function(){console.log()}
        a = 10;
    }
    console.log(a)
    

    Will be rendered as

    var a;
    a = 1;
    if(true) {
        a = function(){console.log()}
        a = 10;
    }
    console.log(a) // output:10
    

    Case 5

    var a = 1;
    if(true){
        function a(){};
        a = 10;
        console.log(a) 
    }
    console.log(a) 
    

    Will be rendered as

    var a;
    a = 1;
    if(true){
        a = function() {};
        let a;
        a = 10;
        console.log(a); // output:10
    }
    console.log(a); // output : f a(){}
    
    0 讨论(0)
  • 2020-12-24 08:26

    The simple solution to this is to use IIFE

    (function() {
    var sahil = {
      checkThis: function() {
        console.log(this);
    
        function checkOther() {
          console.log(this);
        }
        checkOther(); // checkThis() function called in "global context", will
                      // return "this" as "window"
      }
    };
    var moo = sahil.checkThis;
    moo(); // moo() function called in "global context", will return "this" as "window" })();
    
    0 讨论(0)
提交回复
热议问题