预解析
在js运行时会进行三件事:1.语法分析 2.预编译 3.解释执行
语法分析:会在代码执行前对代码进行通篇检查,以排除一些低级错误
预编译:发生在代码执行的前一刻
解释执行:就是执行代码
☞ 思考1
var num = 5;
console.log( num );
☞ 思考2
console.log( num );
var num = 5;
☞ 思考 3
function f1 () {
}
f1();
☞ 思考4
f1();
function f1 () {
}
预解析:
1. js 代码执行先执行预解析,会把带有var和function关键字的事先声明,并在内存中安排好,然后再从上到下执行js语句,预解析只会发生在通过var定义的变量和function上。
2. 先进行变量提升: 把变量声明提升到当前作用域的最上面,不包括变量的赋值
3. 函数提升: 把函数声明提升到当前作用域的最上面,不包括函数的调用
【预解析:变量和函数】
【带有var的变量,把这个变量的定义语法,提到当前作用域最前面(注意:只定义不赋值)】
【带有名字的函数,把这个函数的定义语法,提升到当前作用域最前面(注意:只定义不调用)】
注意:如果函数名和变量名一样,函数优先
预解析案例分析:
1.
var a = 25;
function abc () {
alert(a);
var a = 10;
}
abc();
2.
console.log(a)
function a () {
console.log("aa");
}
var a = 1;
console.log(a);
3.
var sum = 10;
fun ();
function fun () {
console.log( num );
var num = 20;
}
4.
var a = 18;
f1();
function f1 () {
var b = 9;
console.log(a);
console.log(b);
var a = 123;
}
5.
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 outer() {
var a = '变量1'
var inner = function () {
console.info(a)
}
return inner // inner 就是一个闭包函数,因为他能够访问到outer函数的作用域
}
var inner = outer() // 获得inner闭包函数
inner() //"变量1"
坑:
引用的变量可能发生变化
function outer() {
var result = []
for (var i = 0;i<10;i++){
result[i] = function () {
console.info(i)
}
}
return result
}
this指向问题
内存泄露问题
沙箱
运行在一个独立的空间的与外界无关
沙箱,即sandbox,顾名思义,就是让你的程序跑在一个隔离的环境下,不对外界的其他程序造成影响,通过创建类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。
(function(){
var i=0;
})();
柯里化
是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
// 普通的add函数
function add(x, y) {
return x + y
}
// Currying后
function curryingAdd(x) {
return function (y) {
return x + y
}
}
add(1, 2) // 3
curryingAdd(1)(2) // 3
好处(现象):
参数复用、 提前确认、延迟运行
代码规范
1, 命名规范
变量,函数的命名必须有含义
◆ 变量 的名称一般用名词
◆ 函数 的名称一般用动词
2,变量规范
◆ 操作符 前后 加 空格
var b = 2;
3, 空格规范
if () {
}
for () {
}
var ary = [1, 2, 3, 4];
function fn () {
}