【问题标题】:Having problems with hoisted functions and variables in Javascript, can anyone help me?Javascript 中的提升函数和变量有问题,谁能帮助我?
【发布时间】:2014-12-09 04:57:46
【问题描述】:

我一直在尝试理解javascript中的提升函数和变量的概念,我发现这篇优秀的文章http://javascriptissexy.com/javascript-variable-scope-and-hoisting-explained/?WPACFallback=1&WPACRandom=1417555130400,但我仍然无法解决或理解:

var myName = "Xavier";

function myName(){
    console.log("Mi nombre es Javier");
}
console.log(typeof myName); //this suppose to print "string" but insted I get "function".

根据我从文章 Javascript 中读到的内容:

var myName;

function myName(){
    console.log("Mi nombre es Javier");
}
myName = "Xavier";
console.log(typeof myName); //prints "string"

根据提升原则,变量声明和函数声明都被提升到定义它们的范围的顶部。

感谢任何可以帮助我的人,提前致谢。

【问题讨论】:

  • 你在什么 javascript 环境中得到这个结果?我刚刚在 Firefox 控制台中尝试过,并在您提供的第一个代码示例(“字符串”)中得到了预期的结果。这是什么浏览器?还是 node.js?您是在文档的顶层还是在函数中执行代码?等等。我很好奇这里发生了什么!
  • 你在说什么。 :( (X)哈维尔教授
  • 如果你在开发者工具中逐行输入这行,它是行不通的。但是你可以通过将它放在一个独立的函数中来重现它:function test(){ var x = "string"; function x(){}; console.info(typeof x); }。这将打印“字符串”,因为函数声明确实“更早”发生,请参阅@TigerScott 的答案。
  • 如果您不提供更多上下文信息,我们将无法帮助您。到目前为止所有的答案都只是陈述你已经知道的,并没有解决你的问题。

标签: javascript


【解决方案1】:

引用你提到的文章

函数声明和变量声明都被提升到包含范围的顶部。并且函数声明优先于变量声明(但不高于变量赋值)

我通过在Firefox中运行它测试了您在问题中提到的第一个代码块,并且我得到的输出是预期的“字符串”。

这段代码将给出输出“函数”。

var foo;
function foo(){

}
console.log(typeof(foo));

PS:请提及您用于运行代码的环境。只有这样我才能进一步帮助你。

【讨论】:

    【解决方案2】:

    当我仔细阅读这篇文章时,我明白了 - 函数声明在提升时覆盖变量声明 函数声明和变量声明都被提升到包含范围的顶部。并且函数声明优先于变量声明(但不高于变量赋值)。 这有帮助吗?

    【讨论】:

    • 这似乎正在发生。这是一个独立的测试函数,无论环境如何都应该打印“字符串”):function test(){ var x = "string"; function x(){}; console.info(typeof x); }
    • "...但不是变量赋值" 没错。那么你如何解释 OP 看到了//this suppose to print "string" but insted I get "function".?您实际上根本没有回答这个问题,您只是重复了 OP 已经预料到的内容。
    • @FelixKling:我认为 OP 使用了交互式提示并逐行粘贴。那里不可能发生吊装。 (你甚至在进入下一行之前就开始运行代码)
    • @Thilo:可能。但是没有一个答案可以解决这个问题。他们都没有帮助。
    【解决方案3】:

    确实如文章所述? http://jsfiddle.net/txhu587b/

    var myName = "Xavier";
    
    function myName(){
        console.log("Mi nombre es Javier");
    }
    console.log(typeof myName); //prints string
    

    【讨论】:

    • 可以,但是你不能在交互式控制台中重现它,因为如果你逐行运行这段代码,就不可能发生提升。
    • 它在“非交互式”控制台中确实有效:只需将所有五行粘贴到控制台提示符中即可。
    【解决方案4】:

    JavaScript 只提升声明,而不是初始化。

    var x = 5; // Initialize x
    var y;     // Declare y
    

    【讨论】:

    • 那个 OP 已经知道了。你似乎根本没有解决这个问题。
    【解决方案5】:

    你发布的代码

    var myName = "Xavier";
    
    function myName() {
        console.log("Mi nombre es Javier");
    }
    console.log(typeof myName); //string
    

    完全按照您的预期工作,因为 typeof myName 确实是字符串。请参阅 JSFiddle

    【讨论】:

      猜你喜欢
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多