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

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

2017-02-24 14:56 549 查看
在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


总结:至于其余两点,字面上也很好理解,就不赘述了。多读书多读书,打好基础,总是没错的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: