1.预解析
解析JavaScript代码的时候,首先是执行语法分析,然后才是预解析。语法分析----------分析JavaScript代码是否有语法的错误,这是一个最低级的错误,稍不留神就错了。
预解析-----------预览代码,首先把所有的 变量、函数、参数 提前到当前作用域的顶部。注意:函数有最高的权限,其它按照先后顺序覆盖。
alert(a); // a 函数块。 var a = 1; alert(a) // a 赋值后 等于 1。 function a(){ return false; }
分析上段代码,语法分析,没有问题。预解析,var a = undefined 被 var a = function a(){return falase;} 覆盖。其次在按先后顺序执行代码。
2.递归
何为递归?所谓递归函数就是在函数体内调用本函数。不知道各位同胞在项目中有没有用到过递归,反正我是没有用到过。可能是本人学艺不精的原因,还请各位海涵。最简单的例子就是计算阶乘。0和1的阶乘都会被定义为1,更大的数的阶乘是通过计算1*1*...来求得的,每次增加1,直至达到要计算阶乘的那个数。
function test(num){ if(num <= 1){ return 1; }else{ return num * test(num-1)} }
分析上段代码,test(5)为例:
test(5) = 5 * test(4) ==> 必须知道test(4)为何值, test(4) = 4 * test(3) ==> 必须知道test(3)为何值, test(3) = 3 * test(2) ==> 必须知道test(2)为何值, test(2) = 2 * test(1) ==> test(1) = 1; 依次网上返回,最后:test(5) = 5*4*3*2*1。 这里一个关于阶层的方法,就出来了,简简单单就两行代码,档次是不是一下就提起来了,是不是装B好神器。
3.作用域及闭包
作用域:变量在一定的范围内起作用,这个范围就叫作用域,在实际项目中,明明定义了一个变量,却报错或为undefined。有木有?有木有?没有,那你就是大神,本人还是个小菜鸟。
(1)、全局作用域:它的作用域是全局的,定义在js代码的最外层。注意:子作用域是可以访问全局作用域的变量。
(2)、函数作用域:作用于函数内部,我们通常称为块级作用域。一般情况下,是取不到函数内的变量。通过某些特殊的方式还是可以取到的,这种方式叫闭包。
var a; function a() { var a = 10 }; alert(a) //a=10 ;这就叫闭包,是不是很简单。一般不要用,浪费内存。
var a = 10;
function abc(){
var a = 20; alert(a)
} abc() //当函数声明时,会产生一个执行上下文AO,AO={a:10,window:{}},当函数执行时,会产生自己的执行上下文AO,在最顶部,AO={ a:20 },从上往下找,是否能找到想要的变量。在执行完函数的时候,会销毁自己的AO,不再占用的资源。
4.包装类
刚听到包装类的时候,心中有无限的感慨:“这人是多么的6,多么厉害,包装类都知道”。呵呵!问这个问题的人,基本上都是用来装x的。包装类并不是很难理解,对象是不是有属性,方法。那么,字符串呢?数字呢?
str.charAt() 纳尼,字符串这不是可以定义方法吗,难道字符串隶属于对象。错!错!错!都是错。
隐式的进行了以下转换: var str = new String('hello'); // 1 找到对应的包装对象类型,然后通过包装对象创建出一个和基本类型值相同的对象 var s2 = str.chaAt(0); // 2 然后这个对象就可以调用包装对象下的方法,并且返回结给s2. str = null; // 3 之后这个临时创建的对象就被销毁了, str =null;
5.构造函数
构造函数和其它函数没有两样,就是普通的函数,为了区分,构造函数首字母大写。
function Person(){ //隐式创建 var this={} this.name = "祝家庄", this.age = 24, this.sex = "男", this.content = "哈哈哈哈" //隐式返回return Person,当new存在的时候, } var person = new Person(); console.log(person)
6.原型(prototype)
什么是原型?通俗易懂的解释,就是一个对象的祖先,它给我们最实际的用处就是我们可以用原型来创建对象的属性和方法!
我们在来看看打印出来的对象
明明是没有wife这个属性,为什么就能打印出来呢?因为,原型,纳尼,原型这么神奇,不要奇怪,不要惊讶,就是这么神奇,就是这么厉害。系统给你创建了__proto__属性,指向的就是这个原型,当在自己对象上找不到的时候,就会到原型上去找。这里只不过是冰山一角,还有很多关于原型的实例,和概念。如:原型链,原型的增、删、改、查。