Javascript – Funktionsdeklarations- und Variablendeklarationspriorität
学习ing
学习ing 2017-06-12 09:28:15
0
7
889
  console.log(f);//function f(){return 1}
    function f(){
        return 1
    }
    var f=2;

Ich dachte vorher, dass, wenn eine Funktion und eine Variable denselben Namen haben, die Heraufstufung der Funktionsdeklaration die Heraufstufung der Variablendeklaration überschreibt, und dann habe ich den folgenden Code getestet

  function f(){
   return 1
}
var f=2;
    console.log(f);//2

Die Ausgabe von console.log(f) ist je nach Position unterschiedlich. Wer überschreibt wen oder gibt es einen anderen Grund?
Bitte bitten Sie den Meister um eine Erklärung

学习ing
学习ing

Antworte allen(7)
黄舟

第一段

 console.log(f);//function f(){return 1}
    function f(){
        return 1
    }
    var f=2;

相当于=>

var f;
function f() {
  return 1
}
console.log(f); //function f(){return 1}
f = 2;




第二段

  function f(){
   return 1
}
var f=2;
    console.log(f);//2

相当于=>

var f;
function f() {
  return 1
}
f = 2;
console.log(f); //2

参见
https://www.zhihu.com/questio...

某草草

不在块中定义函数时, 先提升函数,再提升变量声明. 参考 ECMAScript 5, section 10.5.

例子如下:

function f(){}
var f;
console.log(f);

var g;
function g(){}
console.log(g);

以上输出为 function. 并不是 undefined.所以先提升函数,再提升变量声明.

洪涛

JS 解释器会首先提升 var 声明,注意是提升 var 声明语句而不是赋值语句
然后,才会提升函数声明。因此,才会形成楼上说的情况

对于第二个情况,感觉和 hoisting 没啥关系。虽然同样提升了 var f,但这里关键在于执行赋值 f = 2 之后才输出的啊。。所以,用来证明 JS 是一个弱类型语言倒是不错的选择= =

可能我说的有歧义,LZ 还是去看下别人的解释吧

黄舟

按ecma的标准,是先提升函数声明的;不过说真的,不管先提升的是谁,结果其实是一样的你知道吗

为情所困

第一段代码是变量提升,var f=undefined,变量f指向了function;第二段代码按照JavaScript的执行顺序,把2赋值给了f。

漂亮男人

js在执行时,会从上往下执行。

console.log(f);//function f(){return 1}
    function f(){
        return 1
    }
    var f=2;

这段代码中,函数声明function f和变量声明var f 一起提升,但是函数声明优先级会更高,
所以代码变成了

var f;
function f() {
  return 1
}
console.log(f); 
f = 2;

f=2(属于赋值,位置不变只是变量声明提升了)

第二段代码

function f(){
   return 1
}
var f=2;
    console.log(f);//2

你同样用如上方法理解
被js引擎理解为

function f(){
   return 1
}
var f;
f=2;
console.log(f);//2

函数f被变量f覆盖,所以输出2

黄舟
console.log(e());//error

if(true){
    function e() {
        return 10;
    }
}

如ycloud所说 以上原因是“函数定义提升只提升到了if 的块作用域内”

if(true){

    function e() {
        return 10;
    }
}
console.log(e());//10

如果函数定义提升只提升到了if的块作用域内,那么以上又是什么原因呢?(chrome58测试) 为何外部又能访问if的块作用域内的函数

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage