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

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

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。

好了,至此你应该明白文章开头的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


这里就不做解释了,请读者自己思考一下

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值