V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
lbfeng

function 声明和变量声明有什么不同?

  •  
  •   lbfeng · Jun 21, 2019 · 4031 views
    This topic created in 2509 days ago, the information mentioned may be changed or developed.
    var foo = 2;
    console.log(foo); // 2
    
    function foo() {
    
    }
    console.log(foo); // 2
    
    var foo = 2;
    console.log(foo); // 2
    
    foo = function () {
    
    }
    console.log(foo); // function
    
    function foo() {
    
    }
    console.log(foo); // function
    
    var foo = 2;
    console.log(foo); // 2
    

    var foo可以覆盖function foo, 反之就不行。js 编译对这种操作是怎么解决的?感觉哪块知识有欠缺。

    Supplement 1  ·  Jun 21, 2019
    懂了。。。。var foo 和 function foo 还是不一样的。function foo 的 hoist 某种程度比 var 优先。
    var foo = 2;
    console.log(foo); // 2

    function foo() {

    }
    console.log(foo); // 2

    其实变成了
    function foo() {

    }
    var foo
    foo = 2;
    console.log(foo); // 2
    console.log(foo); // 2
    Supplement 2  ·  Jun 21, 2019
    10 replies    2019-06-24 01:56:29 +08:00
    Orenoid
        1
    Orenoid  
       Jun 21, 2019 via Android
    我记得 function 声明好像会提升到前面先解释,不是前端,说错勿喷。。
    akiakiseofficial
        2
    akiakiseofficial  
       Jun 21, 2019 via iPhone
    标识符优先级吧,楼下解释,我也不是前端
    Yvette
        3
    Yvette  
       Jun 21, 2019
    楼上好像说反了,是 Variable Hoisting,变量的声明会提升到前面
    faywong8888
        4
    faywong8888  
       Jun 21, 2019 via iPhone
    一个是词法环境下的函数名,不可变(程序员代码运行时不可改变它);一个是普通的变量,可以随便玩
    rabbbit
        5
    rabbbit  
       Jun 21, 2019   ❤️ 2
    进入函数时分两步:
    1 扫描函数内的所有函数和变量,将其绑定到作用域
    2 执行函数代码

    可以把作用域理解成一个对象, 要的时候就去这个对象里找.
    对于步骤 1 也是有顺序的
    先扫描函数,然后在扫描变量


    所以实际运行代码是
    1
    ```
    function foo() {

    }

    foo = 2; // 这个其实 不会被提升, 因为有同名函数了
    console.log(foo); // 2
    console.log(foo); // 2
    ```
    2
    ```
    var foo;

    foo = 2;
    console.log(foo); // 2

    foo = function () {

    }
    console.log(foo); // function
    ```
    3
    ```
    function foo() {

    }
    console.log(foo); // function

    foo = 2;
    console.log(foo); // 2
    ```
    liuy1994g
        6
    liuy1994g  
       Jun 21, 2019 via Android
    就是变量声明提升,function 和 var 可以看作一样的东西
    wolfie
        7
    wolfie  
       Jun 21, 2019
    非前端,第一次碰到时候真的是蒙逼。

    [var 关于变量提升]( https://www.jianshu.com/p/184cb2075d16)
    lbfeng
        8
    lbfeng  
    OP
       Jun 21, 2019
    @rabbbit 正解。var foo 被忽略了。
    Takamine
        9
    Takamine  
       Jun 22, 2019
    所以我用 let。:doge:
    dartabe
        10
    dartabe  
       Jun 24, 2019
    函数声明和函数表达式的区别 函数声明是第一公民 提到最前面 函数表达式只是把变量声明提前 赋值还是在当前位置
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2637 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 11:11 · PVG 19:11 · LAX 04:11 · JFK 07:11
    ♥ Do have faith in what you're doing.