js中关于function两种声明的区别——预解析

转载 2017年10月13日 14:23:54

本文转自(摘要):让我印象深刻的javascript面试题

总结:

//函数表达式,和变量声明同等

var a=function(){
    alert(10)

//函数声明,优于变量声明    
function a(){
    alert(10)


————————————————————————————————————————————————————————————————

例子:

alert(a)
a();
var a=3;
function a(){
    alert(10)
}   
alert(a)
a=6;
a();  

------------分割线------------------

alert(a)
a();
var a=3;
var a=function(){
    alert(10)
}   
alert(a)
a=6;
a(); 


考点其实就两个,第一变量声明提前,第二函数声明优先于变量声明!
下面我简单分析一下,
第一部分运行结果:
1.函数声明优先于变量声明,所以,刚开始,a就是function a(){alert(10)} ,就会看到这个函数。
2.a(),执行函数,就是出现alert(10)
3.执行了var a=3; 所以alert(a)就是显示3
4.由于a不是一个函数了,所以往下在执行到a()的时候, 报错。
第二部分运行结果:
1.underfind
2.报错
在之前说过,预解析是把带有var和function关键字的事先声明,但不会赋值。所以一开始是underfind,然后报错是因为执行到a()的时候,a并不是一个函数。


————————————————————————————————————————————————————————————————————————

预解析和作用域:

var a=0;
function aa(){
    alert(a)
    a=3
}
//结果是什么都没发生,因为要执行aa函数才会执行alert(0)


------------分割线1------------------


var a=0;
function aa(){
    alert(a)
    var a=3
}
aa();
//underfind  在aa函数里面,有var a=3,那么在aa作用域里面,就是把a这个变量声明提前,但是不会赋值,所以是underfind


------------分割线2------------------


var a=0;
function aa(a){
    alert(a)
    var a=3
}
aa(5)
alert(a)
//5,0   在函数体内,参数a的优先级高于变量a


------------分割线3------------------


var a=0;
function aa(a){
    alert(a)
    a=3
}
aa(5)
alert(a)
//5,0   在函数体内,执行alert(a)和a=3,修改的的并不是全局变量a,而是参数a


------------分割线4------------------


var a=0;
function aa(a){
    alert(a)
    var a=3
    alert(a)
}
aa(5)
//5,3
//这个我也有点不理解,请教网上的说法,有两个答案(小伙伴如果知道怎么理解,欢迎在评论上指点)
//1.参数优先级高于变量声明,所以 变量n的声明其实被忽略了,此时相当于
//var a=0;
//function aa(a){
//  var a=5;
//    alert(a)
//    a=3
//    alert(a)
//}
//aa(5)


//2.形参和局部变量优先级一样,此时相当于
//var a=0;
//function aa(a){
//  var a;    先声明
//  a=5      由于形参和变量名称一样,覆盖了!
//    alert(a)
//    a=3
//    alert(a)
//}
//aa(5)


------------分割线5------------------


var a=0;
function aa(a){
    alert(a)
    a=3
    alert(a)
}
aa()
alert(a)
//underfind  3  0 
//首先,参数优先级高于全局变量,由于没传参数,所以是underfind
//a=3,实际上修改的时形参a的值,并不是全局变量a,往下alert(a)也是形参a
//最后的alert(a),你懂的


JS中的变量声明——var,let,const的区别

简述 var 作用域:函数;可以重新分配;可以修改;同一作用域可以重复声明 let 作用域:块级;可以重新分配;可以修改;同一作用域不能重复声明 const 作用域:块级;不能重新分配;可以修改...

js声明函数(function)和变量(variable)不得不防的坑

在工作中初级程序员容易忽略的细节就是函数和变量的声明都存在提升,而且他们之间的提升是不同的...

javascript两种function的定义介绍及区别说明

javascript两种function的定义方式function a(){}和a=function(){}具体使用如下,感兴趣的朋友可以参考下,希望对你对你学习function的定义有所帮助 ...

Day5-function函数与函数嵌套,局部与全局变量,部分快捷键,随机数范围,多文件,头文件的两种区别

arc4random_uniform(100)指随机产生0 ~ 99这100个数字,需要导入 “ sodlib.h ” 这个文件 function : 函数 ,一个函数的使用顺序:声...

Javascript 两种 function 定义的本质区别

两种常见的function定义:1⃣️var func = function(){ ... }2⃣️func = function(){ ... }两种定义方式在表现形式上的不同:第一种var方式定义...

jsp两种声明变量<%! %>和<% %>的区别

初学JSP,说一下自己对jsp两种声明变量和的理解,如果有不对的地方,请指正。 先看代码,简单的投票统计页面: 无标题文档 ...

网站开发进阶(六)JSP两种声明变量的区别

JSP两种声明变量的区别 在JSP中用两种声明变量的方法,一种是在内,一种是在内。他们之间有什么区别呢?我们直接看一个JSP文件来理解。 代码如下: JSP Declarations ...

IOS中两种变量声明方法的区别

一直有疑问,在objective_C中声明变量会有 2种方式,今天有空和网友讨论了下,并且自己查了stackoverflew后算是稍微弄懂了一点。记录如下:       用了一段oc;会发现有2种定...

JSP两种声明变量的区别

在JSP中用两种声明变量的方法,一种是在内,一种是在内。他们之间有什么区别呢?我们直接看一个JSP文件来理解。 count.jsp 代码如下: http://www.w3.org/TR/xh...
  • H12KJGJ
  • H12KJGJ
  • 2017年05月06日 19:11
  • 133

JSP两种声明变量的区别

在JSP中用两种声明变量的方法,一种是在内,一种是在内。他们之间有什么区别呢?我们直接看一个JSP文件来理解。 count.jsp 代码如下: http://www.w3.org/TR/...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:js中关于function两种声明的区别——预解析
举报原因:
原因补充:

(最多只允许输入30个字)