在js中函数和变量都有声明提升的特性,就是不论function语句(函数表达式除外)或者var语句写在哪里,在代码解析时都会自动提升到当前作用域的最前面。注意:只是声明提升,变量的赋值不会提升。 比如说 var b=3; function b(){} alert(b)在代码解析时会变成:function b(){} var b; /*上边是声明提升的部分*/ b=3; alert(b) 而 var b=3; var b=function(){} alert(b) 在代码解析时会变成: var b; /*上边是声明提升的部分*/ b=3; b=function(){} alert(b)
js引擎有预编译机制,我帮你用预编译翻译下上面两句代码。 翻译前:var b = 3;function b(){alert(b)} 翻译后:var b; function b(){alert(b)}; b=3 ______________________________________________翻译前:var b=3;var b=function(){alert(b)} 翻译后:var b; var b; b = 3; b = function(){alert(b)} 预编译 先处理全局变量 -> 再处理全局具名函数 -> 再开始按顺序执行脚本
这是因为,没var 一个变量都会存在栈里面(var b 这个变量), 而 function b() {} 会保存在堆里面,当你调用了b方法 里面就会创建一个临时的内存空间 alert(b) ,这时候我们就会去找, 看看栈里面有没有这个变量,有我们就从栈里面提取 出来 因为栈是比堆要小的多, 如果碗里面有个鸡蛋和池塘里面有鸡蛋,哪个会找得快一点,所以这里我们就会输出栈里面的变量所指向3的这个值,其实就相当于一个内存地址.
比如说
var b=3;
function b(){}
alert(b)在代码解析时会变成:function b(){}
var b;
/*上边是声明提升的部分*/
b=3;
alert(b)
而
var b=3;
var b=function(){}
alert(b)
在代码解析时会变成:
var b;
/*上边是声明提升的部分*/
b=3;
b=function(){}
alert(b)
翻译前:var b = 3;function b(){alert(b)}
翻译后:var b; function b(){alert(b)}; b=3
______________________________________________翻译前:var b=3;var b=function(){alert(b)}
翻译后:var b; var b; b = 3; b = function(){alert(b)} 预编译 先处理全局变量 -> 再处理全局具名函数 -> 再开始按顺序执行脚本
第二个是首先定义了一个变量b,并且赋值为3,然后再将b赋值为function(){},此时b=function(){}。
var b=3;var b=function(){} aIert(b);=:赋值 第一个函数3赋予b 第二个function(){}赋予b
2个值不一样因为在一个函数内,变量前面有var 说明是局部变量, 该变量只能在函数内部有效,跳出本函数失效.