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
?<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
- JS深入学习知识整理(写下每日的收获! )
- 利用js中prototype的知识写下拉菜单
- 现在写下我的第一篇博客,希望以后能融入进这个大家庭,收获知识,分享快乐
- discuzX3.2每日学习收获
- 【程序员学习心得】学习JS的收获
- 今天收获的知识。。。。。。
- 写下每天的收获(2017年2-3月)
- 每日收获
- 分享Excel学习知识 收获水平提高的快乐
- 考完研后将深入学习的知识
- 有关js方面知识的整理
- JS事件知识的一些小整理
- 整理屋子的意外收获
- 整理一点js知识
- js知识整理(一)
- 学习RFC2617的收获
- 学习阶段的收获
- 【学习笔记】需要深入研究的知识。
- 黑马程序员---jdk1.5新特性
- 苹果Mac产品线的10大改进:铝外壳将消失
- 黑马程序员之项目开发学习笔记:酒店管理系统(HotelManager)
- oracle体系结构了解内容
- android - JNI接口函数 (1)
- JS深入学习知识整理(写下每日的收获! )
- 修改alertDialog的透明度和弹出位置
- Windows Store向应用开发人员开放了120个国别的市场
- 另一种root方法,Android boot.img破解
- IOS中UIViewController小结
- 微软明天正式发布Visual Studio 2012
- 淡淡简单描述javascript中方法apply和call
- iPhone 5预定时间提早 将于9月14日上午开始
- 苹果新版操作系统iOS 6将随iPhone 5一起发布