Java Script 学习笔记

有关作用域

在JS的全局中,所有声明的变量都是 window的对象属性。

例如:

1
2
3
4
var a = 100;//声明变量a等于100
//这时候 a 会增加到 window 的属性中,所以:

window.a === a //true

在函数体中的变量,如果没声明,则依然会把变量赋予全局(window)例如:

1
2
3
4
5
6
7
function test() {
var r = y = 200;//只声明了变量r,没有声明变量y
};
test();
//这时候 如果
window.r ;//会报错找不到,而
window.y; //则不会报错。因为在函数体里面,y没有被声明,所以这个y直接被赋值给了全局对象 window

在全局范围内:
var nc = 100然后写一个方法

1
2
3
4
5
function tv (){
var nc = 456789
console.log(nc)
};
tv();

这时候输出的是 456789,因为函数体内部有nc变量,如果函数体内部没有,则输出全局对象 window中的nc属性.

另外,如果上面这段函数体中,没有进行函数声明 var (声明),就直接复制,那么运行函数后,则nc函数也被赋值给了全局对象,覆盖原来的nc值.

预编译的逻辑

预编译,是指在函数执行的前一刻

  1. 创建AO对象(Activation Object 作用域–执行期上下文)
  2. 先找形参和变量声明,将变量声明和形参作为AO对象的属性命名,值为 undefined
  3. 将实参和形参统一。
  4. 在函数体里面找函数声明,把赋予函数体赋予函数名。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
function cc (){
console.log(a);
var a = 123;
console.log(a);
function a () {}; // 这个是函数声明,带有函数名的,是函数声明
console.log(a);
var b = function (){}; // 这是函数表达式,不能在预编译时被提升
console.log(b);
function d (){};
}

cc (1);
  1. 预编译开始,创建了一个OA{}对象.

    1
    2
    3
    AO {

    }
  2. 先找形参和变量声明,将变量声明和形参作为属性名.

    1
    2
    3
    4
    AO {
    a : undefined;
    b : undefined;
    }
  3. 将实参和形参统一.

1
2
3
4
5
//把 cc(1) 传入的 1 赋值给变量a.
AO {
a : 1;
b : undefined;
}
  1. 找到函数名,把函数体赋值给函数名
1
2
3
4
5
AO {
a : function a () {};
b : undefined;
d : function d (){};
}
  1. 这时候函数的AO对象创建完成,开始执行函数体了
1
2
3
4
5
6
7
8
9
10
11
// 执行函数体时,是按照顺序执行.
function cc (){
console.log(a); // 当第一次打印 a的时候,这时候,会在AO对象里面找函数名 a.而这时候函数名 a的值是: function a () {} 一个函数体.
var a = 123; // 执行到这里时,123又赋值给了 AO对象中的 a
console.log(a);//所以这时候这个 a 等于 123了.
function a () {}; // 这句在创建 AO对象时已经读取过了.所以略过.
console.log(a); // 所以这里打印的 a 依然还是 123
var b = function (){}; // 这时候 把一段函数体 赋值给了 b.
console.log(b); // 所以这时候打印的b 是函数体
function d (){}; //最后这条已在创建AO对象时候赋值过了,所以略过
}

所以最后打印的输出为:

1
2
3
4
ƒ a () {}
123
123
ƒ (){}

全局预编译的过程

跟函数体的预编译过程一样,全局预编译会生成一个GO对象.
同样的 执行上面 函数体 预编译的过程步骤,不过GO不会有实参了.所以省略了一步.

JS的对象

对象的创建方法:

  1. 对象字面量的方法,就是直接使用 var 变量名 = {}这样就可以.
  2. 还有两种,构造函数创建方法和自定义的方法.
1
2
3
4
5
6
var obj = new Object();//系统自带的构造函数
obj.name = 'abc'; //这样可以给对象添加属性了.(最好使用单引号,因为PHP默认是单引号,写双引号就需要转义了)

//另外一种自定义构造方法是
function presson (){};
var presson1 = new presson();//使用关键字new可以构造出presson1这个对象.

由于在js中构造函数跟正常的函数没有任何区别,所以为了区别对象和函数名,在使用构造函数的时候,构造函数名应该使用 大驼峰式命名规则. PressonKion

1
2
3
4
5
6
7
8
9
//构造工厂的方法.
function Car (){
this.name = 'BMW',
this.height = '1400',
this.lang = '4900',
this.weight = 1000
};

var car1 = new Car();//这样就构造出了一个 car 的对象.

如果需要在函数构造的时候自定义对象的属性值,怎么办?
直接传参尽量就行了.比如:

1
2
3
4
5
function Car (name,color){
this.name : name,
this.color : color
};
var car1 = new Car ('bmw','red') //传参给构造工厂,这样构造出来的car1对象的 name属性就是 bmw,而 color 属性就是 red 了.

构造函数的基本原理:

  1. 必须要在构造的时候加上关键字 new ,
  2. 当使用构造函数的时候会在函数内AO 对象先生成一个隐式加上一个 this{}的空对象.
  3. 当对象构造完成后,会隐式的进行一个返回对象的操作 return this.
© 2018 Ken的博客 All Rights Reserved. 本站访客数人次 本站总访问量