作用域
全局变量
不应该在函数中var定义的,可以在整个项目中使用的
var abc = 1234 //全局变量
abcd = 2345 //全局(即windows)属性
结果
> abcd
< 1453
> delete window.abcd
< true
> delete window.abc
< false
> abcd
VM608:1 Uncaught ReferenceError: abcd is not defined
at <anonymous>:1:1
函数定义
function test(){
var ab = 45
}
test() //其他地方可以看到ab的值
function test(){
var a = 3
return a+3
}
console.log(test()); //6
console.log(a) //undefind
块状作用域(ES6新特性)
在{}中的就是一个块
function test(){
var a = 3
function test2(){
var b = 2
return a+b //test2没找到a就向上找a
}
return test2 //给外界提供访问test2的口子
}
在ES6以前是没有块状作用域的概念,所以块内部的是不会被封装
function test(){
var a = 3
if(a===3){
var b = 4
console.log('abc')
}else{
console.log('abcd')
}
return a+b //可以找到b
}
var,const
let
function test(){
var a = 3
if(a===3){
let b = 4
console.log('abc')
}else{
console.log('abcd')
}
return a+b
}
this是一个动态的作用域
var和let的区别
- window可以访问var
- var可以重复定义
- let不能进行变量提升
const
- 不能给常量复制