一次技术面

Posted by luoway on October 8, 2015

JavaScript 数据类型

数据类型是一门语言的特征。理解和记忆所掌握的每一门语言的数据类型是非常有必要的。

w3school: JavaScript 数据类型

JavaScript中有 6 种数据类型:Boolean、Number、String、Array、Object、Undefined和Null

类比

PHP 变量类型有 8 种:整型、浮点型、布尔型、字符串、null、数组、对象、资源型(、undefined);

C 数据类型分类相当丰富:

C数据类型


JavaScript 闭包

在《单页Web应用 :JavaScript从前端到后端》中有相关知识点的详细介绍

首先,我们需要理解函数的作用域。

变量作用域:

var a=”I am global !”;
function prison(){
	var b = “I am local !”;
}
prison();
console.log(a); 	//I am global !
console.log(b);		//Error

即,函数内部可以访问外部变量,外部不能访问函数内的局部变量。

延伸

作用域链:子层可以访问父层及外层,父层及外层访问不到子层。


学习Javascript闭包(Closure)

我的理解是,闭包就是能够读取其他函数内部变量的函数。

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成”定义在一个函数内部的函数”。

在《单页Web应用 :JavaScript从前端到后端》阅读笔记中,我做出了如下小结:

闭包:阻止垃圾回收器将变量从内存中移除的方法,使得在创建变量的执行环境外面可以访问该变量

function b() { 
	var i = 0; 
	function c() { alert(++i); } 
	return c;
}
var a = b();
a();

内函数可以访问外函数的变量(作用域),而最外层需要通过内函数调用外函数的变量,这就形成了一个闭包,阻止了外函数被回收。

闭包模型:结构 A>B>C,调用 A—>C—>B。

附上一道易错题:

function Fun(){
    var i=0;
    function q(){
        console.log(i++);
    }
    return q;	//返回q而不是q();
}

var f1 = Fun(), f2 = Fun();
f1();	//0
f1();	//1
f2();	//0

console.log(Fun);   //function Fun()
console.log(Fun()); //function q()

将函数赋给变量,使得变量名成为函数名,结果像是变量成为函数的实例,多个变量即多个实例。 在以下情况变量取代函数名:

var f1 = function Fun() {
    console.log('f1');
};
f1(); //f1
Fun();//Error: Fun is not defined

闭包的应用场景

从作用域的角度出发,如前例,函数b中定义的变量i只有函数c才能访问,而无法通过其他途径访问到,因此保护了i的安全性。

1.在内存中维持一个变量。依然如前例,由于闭包,函数b中i的一直存在于内存中,因此每次执行a(),都会给i自加1。

2.通过保护变量的安全实现JS私有属性和私有方法(不能被外部访问)

以上2点是闭包最基本的应用场景,作用是保护函数内的变量存在和私有

自执行匿名函数

(function(){
	//do something;
})();

向匿名函数传递参数

(function(){})(“abc”);  <==>  var abc=function(a){};abc(“abc”);

避免jQuery的$被占用

(function($){})(jQuery);

闭包与自执行匿名函数的区别

闭包:保护函数内变量的安全;

自执行匿名函数:保护函数名不被覆盖。

两者结合对外实现接口封装。


js\jQuery 异步编程

这是我没有深入学习的部分,而Promise对象在笔试中也经常考到。

Javascript异步编程的4种方法

异步操作和Async函数

ES5、ES6,还有模式、工程化、模块化,在前端领域我需要学习的东西还有很多很多。

加油!