函数声明和变量声明优先级

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

之前以为如果函数和变量同名 ,函数声明提升会覆盖变量声明提升,之后测试如下代码

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

console.log(f)位置不同会输出不同,到底是谁覆盖谁呢,还是别的什么原因?
求大神讲解

第一段

 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的块作用域内的函数

  • 百度图片切换图片时url会改变,但无刷新,没用hash,IE8也支持,请问是用了什么技术?
  • 通过localStorage实现表格点击行置顶 且刷新页面保持当前状态
  • iOS弱网外部js加载问题
  • 如何在按钮单击一次就把图片变大,然后再单击一次图片又变小,我做了个if语句判断
  • web移动端开发遇到虚拟键盘弹出的问题 . 哪位大神给答疑解惑 ????
  • webpack打包的问题,如何处理工程全局依赖?
  • 前端(web页面上)实现快捷键操作被其他软件全局快捷键冲突了,一般怎么处理?
  • 这段js代码哪里出错了?
  • webpack打包同时,如何生成一个带有当前hash值的json?
  • kindeditor上传本地图片
  • 关于angularjs的全局空间污染的问题