【问题标题】:Why is my variable not being hoisted?为什么我的变量没有被提升?
【发布时间】:2012-10-11 16:30:05
【问题描述】:

我有一个全局变量 i 递增(参见小提琴 here):

(function increment() {
   i += 1;   
})();

i = 0;

​在 Chrome 中,我收到错误 Uncaught ReferenceError: i is not defined

不应该在这里托管变量i,以便在函数increment内部,变量i被定义为undefined吗?

【问题讨论】:

    标签: javascript hoisting


    【解决方案1】:

    变量声明语句被提升。你没有声明。

    声明语句使用var 来声明变量。由于您尚未声明它,因此您所拥有的只是赋值表达式,它在表达式求值时隐式创建全局变量

    换句话说,没有正式声明就意味着没有提升。


    现在假设您确实正式声明了它,允许提升变量声明。 IIFE 内部的操作会产生NaN,但会被后面的0 赋值覆盖。

    这是因为只提升了声明,而不是赋值

    // The 'var i' part below is actually happening up here.
    
    (function increment() {
       i += 1;   // "i" is declared, but not assigned. Result is NaN
    })();
    
    var i = 0; // declaration was hoisted, but the assignment still happens here
    
    console.log(i); // 0
    

    【讨论】:

    • i = 0这行不是声明和定义,合二为一吗?
    • @Randomblue:它创建它,但它不是声明语句。它是一个赋值表达式,在表达式求值时隐式创建变量。
    • i=0 不创建变量吗?我认为问题在于i += 1。它相当于i = i + i,并且您正在尝试使用尚未声明的i
    • @MalSu:它会创建它,除了 i += 1 先发生,所以 ReferenceError 在它有机会之前出现。如果var被用来正式声明i变量,那么该声明将被提升到函数(或全局环境)的顶部,即使声明也不会出错i += 1之后出现。
    • @user1689607 啊!谢谢! +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多