1.使用var,let,const进行变量声明   
     
2.函数式声明以上两种声明变量的区别在于:
涉及变量需提前时,第一种只是变量提前,赋值不提前。而第二种函数式声明的话不仅变量提前,赋值也会提前。举个例子:看下图,输出则是function a () {console.log('2')},function a () {console.log('1')},因为d是局部变量,所以会报错。

解决方案 »

  1.   

    第一,最外层的function要加括号 (function(){})()第二,function 之外的 alert 报错,function内的d和c作用域仅在函数内
      

  2.   

    另外,你这个和赋值提前没有关系如果不在同一个js片段中,则是线性的如果在同一个js中,整个js片段应该是同时放到解释器中,作为一个对象来处理,而function的方式属于构造时赋值,var属于执行时赋值恩,不知道说的对不对
      

  3.   

    你的第一,不知你是看漏了function前面的‘+’,还是没了解过这个‘+’的写法,你指出的第二,alert(d)就是为了测试d未声明。
      

  4.   


    !function () {
    alert(a)
    a()
    var a = function () {
    console.log('1')
    }
    function a () {console.log('2')}
    alert(a)
    var d = c = a
    }()
    alert(d)
    alert(c)其中
    alert(a)
    a()
    var a = function () {
    console.log('1')
    }
    function a () {console.log('2')}
    alert(a)
    就是考的两种声明方式的提前,d,c只是附加的作用域问题的。不过还是挺感谢你一起来探讨的,3q
    另外,你的这个:function的方式属于构造时赋值,var属于执行时赋值,就很好的解释了声明提前和声明+赋值提前了。
      

  5.   

    正常,我经常把function里的funtion写在最下方,调用写在上方。不过这函数调用和赋值是一回事吗?
      

  6.   

    按我个人理解,所有的js内容加载时,都是以window为根的,相当于直接运行了 window.property 之类的方法,也就是封装了js片段例如 var a = 'a';那么 window.a 就是字符串'a'但这个赋值需要运行到这里才会生效如果 function a(){return 'a'}那么 window.a 就是function但这个无须确定执行,当js片段加载时即可生效了(即便是代码异常时也不例外例外,例如:alert(z);var y='bbb';function y(){return 'a'};console.log(window.y),代码报了异常,然而,我再次单独执行console.log(window.y),缺发现他其实已经被构造成功了)而js作为一个弱类型的解释程序,构造方法一定优先于执行指令,我觉得没有什么可讨论的结论就是,在同一代码片段中,同级的 function 构造一定优先于执行指令
      

  7.   

    按照我个人猜想,类似于强语言类的类定义,不过每个代码片段都相当于window的引用,也就是ref,然后function相当于方法构造,function之外的指令相当于static执行块,嗯,大概就是这个意思