您的位置:首页 > Web前端 > JavaScript

Javascript中变量提升的问题

2016-12-19 09:58 281 查看
一、函数声明变量提升

函数声明具有变量提升的问题,所以在函数被声明之前就可以访问。

//else中的语句相当于将if中的function重写,因此无论flag为何值,返回的方法始终为重写后的方法。
//将方法赋值给一个变量,方法就不会被重写,因此才能得到正确的结果。
function functions(flag) {
if (flag) {
function getValue() { return 'a'; }
} else {
function getValue() { return 'b'; }
}

return getValue();
}
console.log( functions(true) );//a


以上注释错误,最后的结果为a

function  functions(flag) {
var getValue = function () {
return "a";
}

var getValue = function () {
return "b";
}

if(flag) {

}
else {

}

return getValue();
}

alert(functions(true));//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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: