变量提升
/*
变量提升:var sum;
代码执行:
引用类型值(对象和函数)的处理
1.开辟一个新的堆内存(16进制的内存地址)
2.把内容存储到对内存中(对象存储的是键值对,函数存储是函数体中的代码字符串)
3.让变量和地址关联在一起
注意:在JS中上一行代码报错,下面的代码都不会再去执行了
*/
consoel.log(sum);//undefined ,因为sum已经声明了,但是未定义
var sum=function(n,m){
return n+m;
}
console.log(sum(10,20));//30
/*
*let中没有变量提升,首先进行的是词法解析,一旦发现当前栈内存里有这个变量,
使用let/const重复声明就会报错
*
*
*/
console.log(1);//词法解析时,报错了,就不会在执行此行代码了
let a=12;Uncaught SyntaxError: Identifier 'a' has already been declared
console.log(a);
let a=13;//
console.log(a);
重复声明
/*
变量提升:function fn(){}; var fn
代码执行:
*/
fn();
function fn(){ console.log(1); }
fn();
function fn(){ console.log(2); }
fn();
var fn = function(){ console.log(3); }
fn();
function fn(){ console.log(4); }
fn();
function fn(){ console.log(5); }
fn();
画图思路**:**
堆栈内存释放
var i = 5;
function fn(i) {
return function (n) {
console.log(n + (++i));
}
}
var f = fn(1);
f(2); //=>4
fn(3)(4); //=>8
fn(5)(6); //=>12
f(7); //=>10
console.log(i); //=>5var obj= {
i : 10,
fn:(function () {
var i = 0;// 加载时开辟的栈内存
return function (n) {
console.log(n + i++)
}
})()
};
var f = obj.fn;
f(10);// 10
f(20);// 21
obj.fn(30);//32
obj.fn(40);// 43
var x = 0,
y = 1;
~ function (x) {
//此处x为私有变量,但是没有赋值,因此为undefined,y为全局变量,因此向上级查找
console.log(x, y); //undefined 1
//条件: 如果或符号左侧为假,则值为右侧的
// 左侧为真,则为左侧的
x = x || 10;
y = y || 20;
console.log(x, y);// 10 1
}();
console.log(x, y);//0 1