作用域
作用域: 在se6之前是没有块级作用域的概念的,se6之后的版本里面才有块级作用域的概念,其作用域与c语言类似,和c语言不同的是JavaScript有作用域链这样的概念:
作用域链: 在JavaScript里面,函数可以嵌套定义,函数内部的子函数存在单独作用域的概念,当子函数内有调用当前作用域内不存在的变量时,则js执行器会向外面最近的作函数内寻找变量,如果不存在,则继续向外查找,就像链子一样。
作用域链案例:
function a() {
var a = 1;
function b() {
function c() {
console.log(a)
}
c();
}
b();
}
a();
//输出1
预解析
预解析其实就相当于代码的规范化排列,代码执行之前需要预解析,之后才是顺序执行代码。(此处需注意避免踩坑)
其规律是:先把函数和变量声明放在当前作用与的最前面,然后进行表达式和方法操作
案例:
var a = 18;
f1();
function f1() {
var b = 9;
console.log(a);
console.log(b);
var a = '123';
}
预解析后:
var a;
function f1() {
var b;
var a;
b = 9;
console.log(a);
console.log(b);
a = '123';
}
f1();
//输出 undefined与9
经典案例
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
相当于以下代码:
function f1(){
var a;
a = 9;//全局变量
b = 9;
c = 9;
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);
//输出:
9
9
9
9
9
Uncaught ReferenceError: a is not defined