关于var与function的解析顺序问题

简介: 先给几段代码,看看你能知道运行结果不 function example1() {     var f = function() {return 1;};     return f;     var f = function() {return 2;}; } var a1 = examp...

先给几段代码,看看你能知道运行结果不

 

function example1() { 

    var f = function() {return 1;}; 

    return f; 

    var f = function() {return 2;}; 

var a1 = example1(); 

alert(a1()); 

 

function example2() { 

    function f() {return 1;}; 

    return f; 

    function f() {return 2;}; 

var a2 = example2(); 

alert(a2()); 

 

function example3() { 

    function f() {return 1;}; 

    return f; 

    var f = function() {return 2;}; 

var a3 = example3(); 

alert(a3()); 

 

function example4() { 

    var f = function() {return 1;}; 

    return f; 

    function f() {return 2;}; 

var a4 = example4(); 

alert(a4()); 

 

function example5() { 

    var f = function() {return 1;}; 

    function f() {return 2;}; 

    return f; 

var a5 = example5(); 

alert(a5()); 

 

function example6() { 

    function f() {return 1;}; 

    var f = function() {return 2;}; 

    return f; 

var a6 = example6(); 

alert(a6()); 

 

function example7() { 

    function f() {return 1;}; 

    var f = function() {return 2;}; 

    var f; 

    return f; 

var a7 = example7(); 

alert(a7()); 

 

先给出运行结果1,2,1,1,1,2,2

 

解释一下,这里必须搞清楚js在解析运行时会把声明放在前边,比如var a=1;那解析时会把var放在当前作用域最前面进行解析,而a=1只是个赋值操作,解析运行时位置不变,举个简单的例子,比如有如下代码:

 

alert(f); 

执行时肯定会报错,因为f未定义,如果我们改写成如下代码

 

var f = function(){}; 

alert(f); 

那一定会打印function(){},这个地球人都知道,如果把代码写成下面样子

 

alert(f); 

var f = function(){}; 

那么可能有人就不太注意了,这时候执行是不会报错的,打印的是undefined,因为执行时会把声明提前,所以上面的代码在解析执行时,实际上变成了以下代码:

 

var f; 

alert(f); 

f = function(){}; 

然后再说一下function,function是一种声明加赋值的写法,还是继续上面的例子,先给出一段代码

 

alert(f); 

function f(){} 

这时候会打印出function f(){},我们可以看到使用function进行函数定义时,不仅声明提前了,就连赋值也提前了,上面的代码在解析执行时,实际变成这样

 

var f; 

f = function f(){}; 

alert(f); 

 

接下来我们讨论var 与 function一起出现的时候优先级问题,function的优先级要大于var,也就是function的声明会在var前面,并且function的赋值会在等号赋值的前面,我们就分析一下文章开关的example5的代码

 

function example5() { 

    var f = function() {return 1;}; 

    function f() {return 2;}; 

    return f; 

var a5 = example5(); 

alert(a5()); 

 

我们看到var和function都声明了一个变量f,而且这个f进行了两次赋值,一次是直接用等号赋值,另一次是function赋值,依据前面的优先级规则,function的声明和赋值都会优先,所以这段代码在解析执行时变成了下面的代码:

function example5() { 

    var f; // function声明 

    var f; // var声明 

    f = function f() {return 2;}; // function赋值 

    f = function() {return 1;}; // 等号赋值 

    return f; 

var a5 = example5(); 

alert(a5()); 

 

所以最后的运行结果为1。

 

案例

1 function example() { 

    f = 1; 

    return f; 

    function f(){return 1;}; 

var a = example(); 

alert(f);

执行结果为1

 

2 function fun(){

    alert(0);

}

fun();

var fun = function(){

    alert(1);

}

fun();

var fun = function(){

    alert(2);

}

fun(); 

function fun(){

    alert(3);

}

fun();

结果是3 1 2 2

 

相关文章
matlab:在FUNCTION处出现解析错误:使用的MATLAB语法可能无效。
matlab:在FUNCTION处出现解析错误:使用的MATLAB语法可能无效。
3004 0
matlab:在FUNCTION处出现解析错误:使用的MATLAB语法可能无效。
|
消息中间件 域名解析 网络协议
【Azure 应用服务】部署Kafka Trigger Function到Azure Function服务中,解决自定义域名解析难题
【Azure 应用服务】部署Kafka Trigger Function到Azure Function服务中,解决自定义域名解析难题
152 0
dpkg:错误:正在解析文件 '/var/lib/dpkg/updates/0014' 第 0 行附近:在字段名 #padding 中有换行符问题的解决方法
dpkg:错误:正在解析文件 '/var/lib/dpkg/updates/0014' 第 0 行附近:在字段名 #padding 中有换行符问题的解决方法
852 0
dpkg:错误:正在解析文件 '/var/lib/dpkg/updates/0014' 第 0 行附近:在字段名 #padding 中有换行符问题的解决方法
|
分布式计算 JavaScript 前端开发
|
自然语言处理 JavaScript
var,let和const深入解析(二)
接着介绍var与let,const在提升的区别,还有随之而来的临时死区和双定义的问题的探讨
1031 0
|
JavaScript 前端开发
var,let和const深入解析(一)
深入主要介绍了var,let和const的一些点
1639 0
var读写和function读写,get/set读写效率比较
var读写和function读写,get/set读写效率比较   var 比 function快4倍左右, get/set和function差不多   95var 读: 567var 写: 563[SWF] D:\flexProject\testSpeed\bin-debug\testSpeed.
|
8月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
776 29

热门文章

最新文章

推荐镜像

更多
  • DNS