变量提升
/*变量提升: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 declaredconsole.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); //=>4fn(3)(4); //=>8fn(5)(6); //=>12f(7); //=>10console.log(i); //=>5var obj= {i : 10,fn:(function () {var i = 0;// 加载时开辟的栈内存return function (n) {console.log(n + i++)}})()};var f = obj.fn;f(10);// 10f(20);// 21obj.fn(30);//32obj.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
