Javscript高级:
函数内部属性 arguments:
arguments(实参:包含所有传入方法的参数)特殊用法: arguments中有一个属性callee,是一个指针,指向拥有这个arguments对象的函数对象(就是当前函数对象的指针)。
例子:(阶乘函数)
function facorial(num)
{
if(num<=1) return 1;
else return num*factorial(num-1);//函数执行与函数名紧耦合在一起了
}
函数属性(区别于前页的内部属性):
每个函数对象包含两个属性:length 和 prototype(原型)
length代表函数定义的命名参数(形参)的个数。
function Pen(price){}alert(Pen.length);//1
prototype 是保存某个对象所有实例共享属性的地方。就是说,比如toString()和valueOf()等方法实际上都保存在prototype名下,只不过通过各自对象的实例访问罢了。
在创建自定义引用类型及实现继承时,prototype属性的作用是极为重要的。
函数属性(区别于前页的内部属性):
在使用call()方法时,必须明确地传入每一个参数。结果和apply一样。
其实apply和call真正的强大用途在于,能够扩充函数赖以运作的作用域:
window.color="red";
var o ={color:"blue"};
function sayColor(a,b){alert(this.color);}
sayColor();
sayColor.call(this,1,2);
sayColor.call(window,1,2);
sayColor.call(o,1,2);
这样扩充的最大好处,就是对象不需要与方法有任何耦合关系。
eval()方法:
它就像一个ECMAScript解析器,强大法力无边!它只接收一个参数,就是要执行的js代码字符串。
当解析器发现eval时,它会将传入的参数当作实际的js语句解析,然后把结果插入到原来位置。
通过eval执行的代码被认为是包含该次调用的执行环境的一部分
var msg="hello";
eval("alert(msg);");
eval("function sh(){alert('hi');}");
sh();
继承(寄生组合模式):
js主要通过原型链实现继承。原型链的构建通过将一个类型的实例赋值给另一个构造函数实现的。
执行环境和作用域:
执行环境(execution context):定义了变量或函数有权访问的其他数据,决定了它们各自的行为。环境中所有代码执行完毕后该环境被销毁。
每个执行环境都有一个与之关联的 变量对象,环境中定义的所有变量和函数都保存在这个对象中
全局执行环境(window对象)是最外围的执行环境。
每个函数在被调用时都会创建自己的执行环境:当执行流进入一个函数时,函数的环境创建并入栈。执行完后栈将环境推出,把控制权返回给之前的执行环境。
当代码在一个环境中执行时,会创建由变量对象构成的作用域链(scope chain)。用来保证对执行环境 有权访问的所有变量和函数的有序访问。作用域链前端始终是当前执行环境的变量对象。全局执行环境的变量对象始终都是作用域链的最后一个。
泛型:
1.泛型集合:
List< T> Dictionary< k,v> IQueryabl< T>
2.为什么不提倡使用ArrayList的原因?
2.1是因为ArrayList内部存储数据的是一个object数组,如果在ArrayList中存储数据类型,会出现装箱和拆箱,从而影响服务器性能.
2.2 类型安全问题:因为ArrayList中所有元素都以object存储,那么在取出元素使用时,也是作为object类型取出,需要做转型;如果不转型,则容易
泛型方法:
泛型内置方法 转型 Cast:
泛型内置方法 按类型筛选集合元素 OfType:
自己转型的方法:
程序集 .exe .dll:
1.程序集是什么:就是源代码编译成IL后的中间代码文件.
2.当程序执行时,虚拟机会从硬盘中加载程序集的代码内容,然后按照代码的语法获取信息,并将每个类的信息,并为每个类单独创建一个Type类的对象,用来存储类的信息(包括:成员变量,构造函数,方法).
所有.Net类都是定义在某个Assembly(程序集)中的,.Net基本类是定义在mscorlib.dll中。exe也可以看做是类库,也可以引用。.net的exe也是Assembly,.net中的exe和dll的区别就是exe中包含入口函数,其他没有区别,exe也可以当成dll那样引用、也可以反编译。
GAC:全局程序集缓存。公用的Assembly放到GAC中。(*)
Assembly类是对Assembly的描述(*)。
AppDomain.CurrentDomain.GetAssemblies()获得程序所有的Assembly
Assembly.LoadFile(),动态从文件加载Assembly,不需要在编译的时候引用。