------------>函数作用域:
顾名思意也就是在创建函数的时候附加的一个作用域
function foo(){
var b=2;
}
console.log(b);//ReferenceError
从上面的代码我们就可以确认在创建函数foo()的时候,我们创建了一个函数作用域,因为在外面找不到这个变量!!!
------------>嵌套的函数作用域
依旧是一个作用域中套着一个作用域
function foo(a){
function dar(){
console.log(b);//13
}
var b=10;
dar();
}
foo(3);
这个例子也说明了作用域是一层一层向上遍历标识符的
------------>函数表达式/函数声明
我们来看一下他们的定义
函数声明:function是声明中的第一个词
函数表达式:function不是什么中的第一个词
我们来看一下例子
var d=function(){}//函数表达式
function foo(){}//函数声明
------------>块级作用域{}
首先我们来看一个"寻常的例子"
for(var i=0;i<10;i++){
console.log(i);
}
console.log(i);//10
在这里我们可以看到变量已经被泄露到了全局作用域中
那我们这么样可以避免这样的污染?!看下面的例子
for(let i=0;i<10;i++){
console.log(i);
}
console.log(i);//ReferenceError
在这里我们使用了一个关键字let,作用是让变量绑定到这个作用域,上面的代码同下
{ let i; for(i=0;i<10;i++){ let j=i; console.log(j); } }
当然还可以这样
{
for(var i=0;i<10;i++){
console.log(i);
}
}
console.log(i);//ReferenceError
还可以这样
(function foo(){
for(var i=0;i<10;i++){
console.log(i);
}
})();//在后面加了一个括号,表示立即执行这个函数表达式
--------------->const
这个关键字就是标明这个标识符是常量的意思
const b=function foo(a){
console.log(a);
};
b(33);
(b=function(d){console.log(d);})(44);//TypeError
这个也说明了const可以放在任何地方