1.创建函数或者变量的同时,它的作用域就已经被规定了,并不取决于在何时或者何地调用。
例子1:
var a=10;
function fn1(){
console.log(a);
}
function fn2(){
var a=20;
fn1();
}
fn2();
这时候输出的是10,而不是20。函数fn1中的a是全局下的a。与它在fn2中调用无关,不管它在哪里被调用,都是a=10;
2.js没有块级作用域
for(i=0;i<9;i++){
console.log(i);
}
console.log(i);//10
3.外部作用域无法访问内部作用域,内部作用域可以访问外部作用域。
4.变量声明如果不带var,那么它就是全局变量。
例1:
var a=3;
function fn(){
c=2;//全局变量
var d=5;
function inner(){
var e=d;//5
for(var i=0;i<3;i++){
console.log(e);//5
}
console.log(i);//3
}
inner();
}
fn();
console.log(c);//2
例2:
// 案例2 变量提升 本作用域优先使用变量//如果没有,去他的父级作用域查找,直到最外层的全局作用域
var a = 'abc';
function test() {
console.log(a); //undefined;
var a = 'def'; // 'def';
console.log(a); // ‘def;
}
test();
console.log(a);
5.函数作用域是一种局部作用域,变量只能在本作用域访问。
6.js没有块级作用域,在for,while,if中声明的变量,外面也能用。
7.js函数中的变量在被执行之前,会全部先声明。如果声明之后未赋值就打印,是undefined