一、函数声明变量提升
函数声明具有变量提升的问题,所以在函数被声明之前就可以访问。
console.log(getValue()); function getValue() { return 'a'; }
需要注意的是现在可以在普通块内部定义函数,不会有变量提升,因为是在执行的时候,才会有函数声明。
//将方法赋值给一个变量,方法就不会被重写,因此才能得到正确的结果。 function functions(flag) { if (flag) { function getValue() { return 'a'; } } else { function getValue() { return 'b'; } } return getValue(); } console.log( functions(true) );//a
getValue(); //getValue is not a function var flag = true; if (flag) { function getValue() { return 'a'; } } else { function getValue() { return 'b'; } }
改成函数表达式的形式如下:
function functions(flag) { if (flag) { var getValue = function () { return 'a'; } } else { var getValue = function () { return 'b'; } } return getValue(); } console.log( functions(true) );//a
2017-2-7更:
函数声明提升优先级大于变量声明提升优先级:
函数表达式没有变量提升的过程:
foo(); bar(); var foo=function bar(){ console.log("111"); }
函数表达式等号后面必须为匿名函数,写成上述形式默认等号后面为匿名函数,所以bar找不到,同时函数表达式没有提升的过程所以无法在函数定义之前访问。
二、var定义的变量,变量提升的问题
判断window对象中是否函数a1变量,var定义的变量会有变量提升,所以a1实质上是在全局环境中。
if(!("a1" in window)){ var a1 = 222; } alert(a1);//undefined
2017-2-7更:
(function(){ a = 5; alert(window.a); var a = 10; alert(a); })();
a是在函数中的一个变量,属于局部变量,全局变量中没有a。
输出结果: undefined 10
hello函数中的t没有通过var来定义,被提升到hello函数外面,覆盖了前面定义的t。
2017-10-6更:
console.log(a); var a = 88; var a = function() { console.log(22); } console.log(a); function a() { console.log(222); } console.log(a);