- 在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
总结:至于其余两点,字面上也很好理解,就不赘述了。多读书多读书,打好基础,总是没错的。