关闭

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

标签: 面试题javascript函数
200人阅读 评论(0) 收藏 举报
分类:

本文转自(摘要):让我印象深刻的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),你懂的


0
0
查看评论

Javascript 两种 function 定义的本质区别

两种常见的function定义:1⃣️var func = function(){ ... }2⃣️func = function(){ ... }两种定义方式在表现形式上的不同:第一种var方式定义的函数,不能先调用,后声明;只能先声明,后调用。 第二种function方式定义函数可以先调用,后...
  • tmacjackson
  • tmacjackson
  • 2016-08-14 21:39
  • 805

JS之预解析

javascript 的预解析 所谓预解析:(个人理解)就是js代码在执行之前 会在相应的执行环境中 预先把 一些东西解析到内存。如果理解错误,请多多指正 那究竟预先解析哪些东西那??答:预先解析 function 和 var 还有就是预解...
  • u014205965
  • u014205965
  • 2015-05-10 14:16
  • 2499

轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)

hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系。其实它们两并不冲突,一个例子轻松理解它们的关系:   你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解析),但吃的时候还是一口一口的吃(JS逐行执行)!     OK,...
  • zxc123e
  • zxc123e
  • 2014-07-05 14:52
  • 1773

JavaScript中的预解析顺序(优先级)

参考链接1: JavaScript函数声明前置与变量声明 参考链接2: javascript的执行顺序处理执行上下文代码分为两个阶段: 进入执行上下文 执行代码 进入执行上下文:进入执行上下文,方法的变量对象(VO)就会被以下属性填充 参数,参数名就是VO中的名称。值就是实参的值。如果没有传递,则...
  • microcosmv
  • microcosmv
  • 2017-03-12 22:51
  • 803

JS预解析

首先我们先来说一下js的解析顺序。js引擎读取一段js代码,首先会进行预解析,也就是从上往下逐行读取代码,寻找所有的var和function(这个后面会详细解释)。当预解析完成后,js引擎在从第一行开始逐行运行js代码。    JS预解析的定义:    在当前作用域下,js运行之前,会把带有v...
  • Honeymao
  • Honeymao
  • 2017-01-29 00:00
  • 356

JavaScript 正则表达式两种使用方式的区别

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE
  • JeamKing
  • JeamKing
  • 2010-02-27 16:08
  • 1715

JavaScript“预解析”简单原理

JavaScript 浏览器 预解析 作用域
  • DarinZanya
  • DarinZanya
  • 2016-11-07 17:43
  • 1006

JS两种function声明的区别

参考链接:http://www.cnblogs.com/alkq1989/p/5556771.html http://blog.sina.com.cn/s/blog_80ff74760101ew9i.html 在JS中有两种定义函数的方式, 1是var aaa=fu...
  • u013033845
  • u013033845
  • 2016-11-29 15:44
  • 211

js里声明函数有几种方式? var abc = function(x){} 和 function abc(x){} 这两种声明方法有什么不同?

先后者是指函数声明,前者是指函数表达式,他们之间的区别是后者会在代码执行之前被JS解释器加载到作用域中,这样一来就可以在编程时在定义函数之前调用这个函数,此法是有效的;而前者则是在代码执行到那一行时候才会有定义,此外函数表达式是创建了一个匿名函数,然后将匿名函数赋值给一个变量。
  • Alecor
  • Alecor
  • 2017-02-27 18:15
  • 1039

13 JavaScript基础之--变量声明提升和预解析

变量声明提升(出现原因:预解析):如果使用变量在定义变量之前,那么会出现变量声明提升把变量的名字提升到达script标签最顶端。特点: 成员变量只提升变量名,不提升变量值。 函数是所有内容全部提升。(function直接定义的—所以在函数定义11章中,函数调用放在任何位置都可以) 容易出现undef...
  • luyu13141314
  • luyu13141314
  • 2016-11-17 16:20
  • 171
    个人资料
    • 访问:181119次
    • 积分:2641
    • 等级:
    • 排名:第16352名
    • 原创:93篇
    • 转载:37篇
    • 译文:0篇
    • 评论:36条
    博客专栏
    最新评论