关于var与function的解析顺序问题
来源:互联网 发布:淘宝bose c5是假货吗 编辑:程序博客网 时间:2024/04/29 06:20
先给几段代码,看看你能知道运行结果不
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);
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。
好了,至此你应该明白文章开头的7个示例代码的运行结果了吧。
最后再给出一个小例子,看你有没有理解
function example() {f = 1;return f;function f(){return 1;};}var a = example();alert(f);执行会报错
function example() {f = 1;return f;function f(){return 1;};}var a = example();alert(f);执行结果为1
这里就不做解释了,请读者自己思考一下
0 0
- 关于var与function的解析顺序问题
- var a = {} 与 var a = function(){} 的区别
- function method(){}与var method = function(){}的区别
- function-a(){}与var-b-=-function(){}的区别
- JavaScript中Function和var 的预解析(浅见)
- Javascript全局变量var与不var的区别深入解析
- 预解析:var散布的问题
- 预解析:var散布的问题
- 域解析:var散布的问题
- javascript之var与function定义的区别
- JavaScript中Function Declaration与Function Expression 或者说 function fn(){}和var fn=function(){} 的区别
- asp问题关于调用function与Sub的区别
- 浏览器对function()的解释顺序问题
- js中 var a = function(){} 与function b(){}两种函数声明的区别
- 关于CNAME与Aliases的解析问题
- 关于Function.prototype.bindAsEventListener方法的解析
- 关于Function.prototype.bindAsEventListener方法的解析
- 函数声明之function与var
- C语法归约之函数(2)
- Children of the Candy Corn(DFS、BFS)
- python 输出颜色与样式
- ISBN号码
- Socket 错误一览表
- 关于var与function的解析顺序问题
- chapter 7 网际协议(IP)
- MySQL有以下几种引擎:ISAM、MyISAM、HEAP、InnoDB和Berkley(BDB)
- 子衿的事(85)
- Android--Android图像开源视图:SmartImageView
- VC++学习笔记第二章
- MFC界面控件自动缩放
- ubuntu 12.04下安装并运行hadoop
- Orcale数据库基础知识总结之orcale数据库的DDL和DML操作