JavaScript预解析与闭包、沙箱、柯里化

预解析

在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 代码执行先执行预解析,会把带有varfunction关键字的事先声明,并在内存中安排好,然后再从上到下执行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 () {
  
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值