JavaScript中变量和函数的提升学习

  • 在JavaScript中变量和函数的声明会提升到最顶部执行。但是匿名函数不会提升。
  • 函数的提升高于变量的提升。
  • 函数内部如果用var声明了相同名称的外部变量,函数将不再向上寻找。
  • 不同 <script> 块中的函数互不影响。

基于以上几点做一些自己的学习总结

1.变量和函数的提升,匿名函数不提升

var表达式和function声明都会被提升到当前作用域的顶部 源代码地址

bar();
var bar = function() {};
var someValue = 42;
test([1,2,3]);
function test(data) {
    if (false) {
        goo = 1;
    } else {
        var goo = 2;
    }
    for(var i = 0; i < 100; i++) {
        var e = data[i];
    }
}

以上代码经过变量提升,函数提升之后

var bar,someValue;//undefined
function test(data) {
    var goo,i,e;
    if (false) {
        goo = 1;
    } else {
        goo = 2;
    }
    for(i = 0; i < data.length; i++) {
        e = data[i];
    }
    console.log(e);
}
bar();
bar = function(){};
someValue = 42;
test([1,2,3]);

//首先bar()会报错因为bar目前还不是方法,someValue = 42;
//test() -> goo = 1 ,e是传入数组的最后一个元素
var myvar = 'my value';  
(function() {  
    alert(myvar); // undefined  
    var myvar = 'local value';  
})();  

经过变量提升

var myvar;
myvar = "my value";
(function(){
    var myvar ;
    alert(myvar);
    myvar = "local value";
})();

//我最初的疑惑是这个闭包算不算匿名函数,但是百度的时候有人说这种说法是错误的,我对闭包理解也不够深刻,所以我就做了一个测试,如果闭包提升了,那么alert应该是undefined,但是结果是alert -> my value; 所以结论就是闭包也不会提升。

var myvar;
myvar = "my value";
(function(){
    alert(myvar);
})();

小结:
1. 首先funtion以及var会提升到当前作用域顶部
2. 匿名函数不会提升,bar = function(){}
3. 闭包不会提升

2. 函数的提升高于变量的提升

var a;
function a(){};
console.log(typeof a);//function

//但是不是function覆盖了var的声明

function a(){};
var a;
console.log(typeof a);//function

另一种情况

function a(){};
var a = 1;
console.log(typeof a);//number

//以上代码等价于

function a(){};
var a;
a = 1;
console.log(typeof a);//a已经被重新赋值,所以当然是number

//交换位置结果也一样

var a = 1;
function a(){};
console.log(typeof a);//number

总结:至于其余两点,字面上也很好理解,就不赘述了。多读书多读书,打好基础,总是没错的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值