标签:固定 for pre 网页 命名 制造 结构 函数 提升
变量提升
此篇木有脑图,嘻嘻
var name = 'zs';
// 这里是注释
if (true) {
}
for(var i = 0; i < n; i++ ) {
}
var arr = [1, 2, 3, 4];
if (a > b) {
}
for (var i = 0; i < 10; i++) {
}
function fn() {
}
变量可以起作用的范围
在任何一个地方都能访问到的变量
只在固定的代码块可以访问到的变量,比如最常见的就是函数内部。对应的局部作用域
var arr = [1, 2, 3, 4]; // 全局变量
if (a > b) {
var c; //局部变量
}
for (var i = 0; i < 10; i++) {
}
function fn() {
}
任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。
在es5之前没有块级作用域的的概念,只有函数作用域,现阶段可以认为JavaScript没有块级作用域
只有函数可以制造作用域结构,那么只要是代码,就至少有一个作用域,即全局作用域。凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。
将这样的所有的作用域列出来,可以有一个结构: 函数内指向函数外的链式结构。就称作作用域链。
// 案例2
function f1() {
var num = 123; // 1级链
function f2() { // 2级链
console.log(num);
}
f2(); // 1级链
}
var num = 456; //0级链
f1(); //// 0级链
// 0级链表示 全局 1级链表示 局部 2级链表示局部的局部 以此类推
JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程
案例
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 = b = c = 9;
// console.log(a);
// console.log(b);
// console.log(c);
// //function f1()内部预解析过程
// var a = b = c = 9;
// var a = 9; // a是局部变量
// b = 9;
// c = 9; // 因为b c没有用var声明 所以 bc是全局变量
// console.log(a);
// console.log(b);
// console.log(c);
// }
// f1(); // 因为上来先调用了函数,所以要先对函数内部进行预解析
// console.log(c);
// console.log(b);
// console.log(a);
定义变量的时候,变量的声明会被提升到作用域的最上面,变量的赋值不会提升
javascript解析器首先会把当前作用域的函数声明提前到整个作用域的最前面
注意:先提升var,再提升function。
案例
var a = 18;
f1();
function f1() {
var b = 9;
console.log(a);
console.log(b);
var a = '123';
}
// var a;
f1();
// f1()内的预解析
function f1() {
var b;
var a;
console.log(a); // undefined a因为变量提升,所以只被声明了,而没有被赋值
console.log(b); // 9
a = '123';
}
a = 18;
console.log(a); // 18
标签:固定 for pre 网页 命名 制造 结构 函数 提升
原文地址:https://www.cnblogs.com/1020-jj/p/10859421.html