V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
lbfeng
V2EX  ›  JavaScript

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

  •  
  •   lbfeng · 2019-06-21 22:04:44 +08:00 · 3550 次点击
    这是一个创建于 2016 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 编译对这种操作是怎么解决的?感觉哪块知识有欠缺。

    第 1 条附言  ·  2019-06-21 23:20:46 +08:00
    懂了。。。。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
    第 2 条附言  ·  2019-06-21 23:49:57 +08:00
    10 条回复    2019-06-24 01:56:29 +08:00
    Orenoid
        1
    Orenoid  
       2019-06-21 22:21:02 +08:00 via Android
    我记得 function 声明好像会提升到前面先解释,不是前端,说错勿喷。。
    xlui
        2
    xlui  
       2019-06-21 22:31:41 +08:00 via iPhone
    标识符优先级吧,楼下解释,我也不是前端
    Yvette
        3
    Yvette  
       2019-06-21 22:34:26 +08:00
    楼上好像说反了,是 Variable Hoisting,变量的声明会提升到前面
    faywong8888
        4
    faywong8888  
       2019-06-21 22:36:40 +08:00 via iPhone
    一个是词法环境下的函数名,不可变(程序员代码运行时不可改变它);一个是普通的变量,可以随便玩
    rabbbit
        5
    rabbbit  
       2019-06-21 22:52:00 +08:00   ❤️ 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  
       2019-06-21 22:57:05 +08:00 via Android
    就是变量声明提升,function 和 var 可以看作一样的东西
    wolfie
        7
    wolfie  
       2019-06-21 22:58:19 +08:00
    非前端,第一次碰到时候真的是蒙逼。

    [var 关于变量提升]( https://www.jianshu.com/p/184cb2075d16)
    lbfeng
        8
    lbfeng  
    OP
       2019-06-21 23:23:07 +08:00
    @rabbbit 正解。var foo 被忽略了。
    Takamine
        9
    Takamine  
       2019-06-22 11:19:31 +08:00
    所以我用 let。:doge:
    dartabe
        10
    dartabe  
       2019-06-24 01:56:29 +08:00
    函数声明和函数表达式的区别 函数声明是第一公民 提到最前面 函数表达式只是把变量声明提前 赋值还是在当前位置
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2128 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:53 · PVG 08:53 · LAX 16:53 · JFK 19:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.