1.什么是预解释
1) 代码开始执行之前,首先进行全部作用的预解释,把带var和function的变量进行声明clear和定义defined
var是声明,声明没有赋值默认是==> undefined,不会进行重复的声明,会进行重复的定义,
function 声明和定义都完成了 ==> 所以可以在函数上面执行, 不会进行重复的声明,会进行重复的定义,
2) 作用域:
全局作用域(window作用域)
私有作用域(函数作用域)
步骤详解:
--函数执行,新城一个新的私有作用域(开辟内存空间)
--形参赋值
--私有作用域里面进行预解释(var, function)
--代码重上到下执行
--执行完毕返回
--外面是否有接收,有的话内存不释放,没有内容释放
3) 变量
A: 全局变量:
全局作用域下定义的变量var、function、let、const、class 、import,全局变量都挂在了window对象上,不可以删除(ES6的class和import,let, const除外)
出现情况:
1) 全局作用域下定义的
2)私有作用域里面的给windowd对象挂的属性和方法
3) 私有作用域内不适用var声明变量,作用域链会增到全局变量
B: 私有变量:
函数里面用var和function定义的变量,在外面访问不到
1) 函数内使用var声明
2) 形参
全局作用域访问私有变量: <<闭包>>
4) 作用域链
当函数执行的时候,形参一个新的私有作用域,访问一个变量,看这个变量是否是var或者function声明的,如果是他就是全局变量,如果没有被var,则从他的上一级作用域里面找,如果还没有,则在上级作用域找,知道找到全局作用域window,
如果是获取的话,会报错 not a defined,如果是设置,则在私有作用域里面设置了一个全局变量
复制代码
2.预解释注意的方法
eg1:
console.log(x); // => undefined
console.log(y); /函数
var x = 1;
function y() {
}
console.log(x); // 1
console..og(y); //函数
复制代码
eg2: 无论条件成立,都要进行预解释
console.log(fn()); //
function fn() {
return 1;
}
if (false) {
function fn() {
return 2;
}
}
fn();
复制代码
eg3: 预解释不会重新的声明,但是会重新的定义defined
var a = 1;
function a() {
return 100;
}
var a = 2;
a();
//==>>重复的定义
fn();
functon fn() {
return 1;
}
fn();
function fn() {
return 2;
}
fn();
复制代码
eg4: return后面是返回值的,虽然不执行,但是还要进行预解释的
function fn() {
console.log(sum()); // ==> sum is not defined 下面是匿名韩式 报错***
console.log(a++);
return function sum() {
console.log('okk~~~');
};
var a = 1;
}
fn();
复制代码
eg5: 函数值表达式只对等号前面的进行预解释,后面的不会
function fn() {
console.log(a);
var a = b = c = d = 1;
console.log(a, b, c, d);
}
console.log(a, b, c, d);
window.a;
window['a']
fn();
复制代码
eg6:函数之函数表达式,是否提前进行预解释
fn(); // fn ==> undefined 声明没有定义,默认值是undefined undefined() 报错了
var fn = function() {};
fn1();
function fn1() {
alert('ok');
}
复制代码
4.作用域链问题:
eg1:
console.log(x, y);
var x = 1;
var y = 100;
function fn() {
console.log(x, y);
var x = 1;
y = 20;
return {
x, y
}
}
fn();
console.log(x, y);
复制代码
eg2:
var x = 1;
var fn = function () {
var y = 2;
x ++;
return function fn() {
return x + y;
}
};
console.log(fn()());
复制代码
eg3: 预解释面试题(***)
var fn = function() {
//==>>预解释 var a; // ==>> undefined undefined ++ ==> Number(undefined)++ ==> NaN ++ ==> NaN
console.log(x++);
return;
var x = 1;
上面代码等价于:
var x;
consoel.log(x);
return;
x = 1;
}
fn(); // ==>> NaN
复制代码