标签:
观察下面两段代码,试写出hello(‘word‘);的运行结果:
// 变量式声明 function hello(msg){ alert(msg); var msg = function(){}; alert(msg); } //函数式声明 function hello(msg){ alert(msg); function msg (){}; alert(msg); }
对于变量式声明,首先弹出word,然后弹出function,而函数式声明,则两次都是弹出function.这是为什么呢?
一: 函数式声明
function hello(msg){ alert(msg); //放在最前面的位置打印msg,是function function msg(){ //这个msg是函数式声明,它会贯穿于整个fun函数的作用域 //也就是说,只要fun一旦调用,甚至只要是进入语法分析阶段 //那么msg函数就会首先解析,你可以把它想象成它是在fun函数 //内的第一个变量。有的书上称这种现象为声明被提前或提升。 } alert(msg);//放在最末尾的位置打印msg,也是function // 说明函数式声明在hello作用域内部是贯穿的 }
二:变量式声明
function hello(msg){ alert(abc); // 此时为undefined var abc = function(){ //这种是变量式声明,它在fun函数内的位置是固定的,也就是说 // var abc之前,abc的值在fun内是undefined // var abc之后,abc才是它声明的值 // 这种方式你可以理解成在fun函数的第一行写了一个var abc; // 也正因为如此,fun内声明的变量,会切断外部变量的引用; // 不论在hello作用域之外,abc的值是多少,在hello内部,在var abc之前,始终是undefined // 这是面试官最喜欢光顾的地方之一 } alert(abc); // 此时才是function
// 这里把abc换成msg,道理也是一样的。对于hello内部来说,它的形参,就相当于是hello内部的局部变量。
// 这里有意用abc来替换msg,其实是为了简化问题,减少干扰项。既然是都hello内的局域变量,那么在声明之前
// 它的值为undefined也就是理所当然的事了。这里唯一有个要注意的地方就是,形参的声明,出现在所有局部变量之前。
// 后面对局部变量进行重复声明,系统会直接无视重复的声明过程,但是声明同时有赋值的话除外。
}
var abc = function(){};
var xxx = abc; var bbb = abc;
引用可以无数,但是真身始终唯一。
标签:
原文地址:http://www.cnblogs.com/afrog/p/4312136.html