我们先来看一个题目:
<script> console.log(typeof a)//undefined var a='littlebear'; console.log(a)//littlebear </script><script> console.log(typeof a)//string var a=1; console.log(a)//1</script>
第一个script里可以看出var a 被提升到顶部,a = 'littlebear'被保留在原地。
第二个script,之所以不先打印undefined ,是因为a在上面已经被var声明过,所以var a不会再次被提升。
再看一个题目:
<script> console.log(a)//function a(){} var a=1; console.log(a)//1 function a(){} console.log(a)//1</script>
可以看到function a(){}被提升到最顶端。说明函数的提升变量的提升
1.变量提升
在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作
用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分。
上个简历的例子如:
console.log(global); // undefinedvar global = 'global';console.log(global); // globalfunction fn () { console.log(a); // undefined var a = 'aaa'; console.log(a); // aaa}fn();
之所以会是以上的打印结果,是由于js的变量提升,实际上上面的代码是按照以下来执行的:
var global; // 变量提升,全局作用域范围内,此时只是声明,并没有赋值console.log(global); // undefinedglobal = 'global'; // 此时才赋值console.log(global); // 打印出global function fn () { var a; // 变量提升,函数作用域范围内 console.log(a); a = 'aaa'; console.log(a);}fn();
2.函数提升
js中创建函数有两种方式:函数声明式和函数字面量式。只有函数声明才存在函数提升!如:
console.log(f1); // function f1() {} console.log(f2); // undefined function f1() {}var f2 = function() {}
之所以会有以上的打印结果,是由于js中的函数提升导致代码实际上是按照以下来执行的:
function f1() {} // 函数提升,整个代码块提升到文件的最开始console.log(f1); console.log(f2); var f2 = function() {}
3.什么是闭包
闭包是有权访问另一个函数作用域的变量的函数。
简单的说,Javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
4.变量的作用域
要理解闭包,首先要理解变量的作用域。
变量的作用域无非就是两种:全局变量和局部变量。
新闻热点
疑难解答
图片精选