JS深入学习知识整理(写下每日的收获! )

来源:互联网 发布:java代码输入 得出代码 编辑:程序博客网 时间:2024/05/20 23:33
属性与原型
 ?<STRONG>①</STRONG>function foo(){this.add = function(){};} 
   
 <STRONG>②</STRONG>foo.prototype.add = function(){}; 
   
  ①中的add是属性;②中的add是原型。 
   
 当调用foo.add时,查询顺序:foo属性--->foo原型--->Object原型 
   
 foo.prototype.hasOwnProperty(prop);判断prop是否为foo的自身属性。<BR><BR><SPAN>delete</SPAN>只能删除属性(除了删除window对象的属性和 configurable=false 的属性),不能删除原型 
 
 原型链和构造函数
 
 function Foo(name){
   this.name=name;
 }
 Foo.prototype.run=function(){};
 var f = new Foo("Test");
 
 注:IE中不支持__proto__。
 f.__proto__===Foo.prototype //true
 f.__proto__.run === Foo.prototype.run //true
 f.run ===f.__proto__.run //true
 f.constructor ===Foo //true
 Foo.prototype.constructor === Foo //true 
 
 闭包
 
 简单的定义:有权访问另一个函数作用域中的变量的函数。从理论角度:所有的函数。因为任意函数在创建之初就已将外层上下文保存起来了。
 哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域。
 从实践角度:以下函数才算是闭包:
 即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回)
 在代码中引用了自由变量
 因为IE垃圾回收机制的问题,如果闭包的作用域链中保存着DOM元素,则该元素无法被回收。即传说中的内存泄露。(Demo...)
 
  
 
 执行上下文
 
 ?JS中仅有函数能创建新的作用域。if,while,for...则不能 
 上下文的执行分为进入上下文和执行上下文两阶段 
 for(var i=0;...){} alert(i);此时,i不为空,因为for并没有给i创建局部上下文,而是在全局上下文定义了i。 <BR><STRONG><BR>this<BR></STRONG>数组元素的this指向该数组对象,例如<BR>var arr = [function(){return this;},3,"SS"];<BR>则 arr[0]()===arr; 
 
 typeof 与 instanceof
 
 
 typeof 只能用来判断变量属于哪一种基本类型,即string,boolen,function等等
 
 instanceof 用于判断对象的从属关系
 例如 var foo = new Foo();
 则 foo instanceof Foo===true在ES5中可以用getPrototypeOf或isPrototypeOf来完成相同功能例如 Object.getPrototypeOf(foo) === FooFoo.prototype.isPrototypeOf(foo)
 
  arguments:对象当前所执行的函数;不是数组,但访问方式与数组相同;可用于模拟方法重载。
 
 ?<STRONG>属性:</STRONG> 
 length 当前方法的传过来的参数个数; 
 callee  当前正在执行的Function对象,且仅当改函数正在执行时才可用,常用于递归运算(同样适用于匿名函数) 
 
 ?例如 function foo(a,b,c){...}  foo(1,3);<BR>arguments.callee===foo //true<BR>arguments.length ===2 //true<BR>foo.length === 3 //true 且只读(即使赋值foo.length=10,输出的时候foo.length仍然为3)<BR>arguments.length与foo.length的区别在于,前者是实参个数,后者是形参个数 
 
 组件模式(紧耦合增益):
 
 var Module = (function(obj){
     obj.old_Method = obj.Method;
     obj.Method = function(){...};
     return obj;
 }(Module ||  {}));
  
 
 
 --------------------------------------------------------------------------------
 
  
 
 函数表达式
 
 函数声明与函数表达式的区别:
 
 ①通过函数声明定义的函数在进入上下文阶段就已经创建;如
 
 function A(){
     ....
 }
 ②而函数表达式则先定义一个变量,当代码执行时才将匿名函数赋给该变量。如
 
 ?var B = <SPAN>function</SPAN>(){ 
     .... 
 } 
 
 对构造函数和一般的函数来说,搞清this所指向的对象并不困难。但匿名函数就比较头晕了。就向下面的这段东东
 
 ?<SPAN style="COLOR: #0000ff">function</SPAN> A(){ 
     console.log(this); 
     eval('console.log(this)'); 
     (function(){ 
         console.log(this); 
         eval('console.log(this)'); 
     })() 
 } 
 <SPAN style="COLOR: #0000ff">new</SPAN> A() 
 
 匿名函数的执行环境具有全局性,因此其中的this对象通常指向window