js高程笔记(3.5)
2017-03-05 22:44
204 查看
闭包
指有权访问另一个函数作用域中的变量的函数当函数执行完毕后,局部活动对象就会被销毁,内存中仅保存全局作用域,但闭包有所不同,在另一个函数内部定义的函数会被包含函数的活动对象添加到它的作用域链中,直到匿名函数被销毁后,才会被销毁
function createFunctions(){ var result=new Array() for(var i=0;i<10;i++){ result[i]=function(){ return i } } return result } //因为每个函数的作用域链中都保存着createFunctions()的活动对象,所以他们引用的都是同一个变量i
//解决方法: 1. function createFunctions(){ var result=new Array() for(var i=0;i<10;i++){ (function a(i){ result[i]=function(){ return i } })(i) } console.log(result[2]()) } createFuncions() 2. function createFuncions(){ var result=new Array() for(var i=0;i<10;i++){ result[i]=function(i){ return function(){ return i } }(i) } console.log(result[2]()) }
关于this对象
匿名函数的执行环境具有全局性,因此其this对象通常指向window
模仿块级作用域
for(var i=0;i<5;i++){ console.log(i) } var i//不会出错,JavaScript从来不会告诉你是否多次声明了同一个变量;遇到这种情况,它只会对后续的声明视而不见。不过,它会执行后续声明中的变量初始化 console.log(i)
(function(){ for(var i=0;i<5;i++){ console.log(i) } })() console.log(i)//出错
私有变量
function MyObject(){ var privateVariable=10 function privateFunction(){ return false } this.publicMethod=function(){ privateVariable++ return privateFunction() } } //在创建MyObject的实例后,除了使用publicMethod()这个途径,没有任何办法直接访问privateVarible和privateFunction()
静态私有变量
(function (){ var privateVarible=10 function privateFunction(){ return false } MyObject=function(){ } MyObject.prototype.publicMethod=function(){ privateVarible++ return privateFunction() } })() var o=new MyObject console.log(o.publicMethod())
模块模式
var application=function(){ var components=new Array() components.push(new BaseComponent()) return { getComponentCount:function(){ return components.length }, registerComponent:function(component){ if(typeof component=="object"){ components.push(component) } } } }
增强的模块模式
var application=function(){ var components=new Array() components.push(new BaseComponent()) var app=new BaseComponent() app.getComponentCount:function(){ return components.length }, app.registerComponent:function(component){ if(typeof component=="object"){ components.push(component) } } return app }
递归
//1. //严格模式下抛出错误 function factorial(num){ if(num<=1){ return 1 }else{ return num*arguments.callee(num-1) } } //2. var factorial=(function f(num){ if(num<=1){ return 1 }else{ return num*f(num-1) } })
相关文章推荐
- 《JS高程(3)》-第6章笔记(02)
- 查询url包含的字符串参数(js高程笔记)
- js高程-前3章笔记
- 《JS高程(3)》DOM扩展-HTML5-第11章笔记(20)
- 《JS高程(3)》BOM-01(window&窗口)-第8章笔记(06)
- JS高程三第四章笔记
- 《JS高程(3)》DOM扩展-专有扩展-第11章笔记(21)
- 《JS高程(3)》DOM节点层次DocumentType类型-第10章笔记(16)
- 《JS高程(3)》DOM操作技术-第10章笔记(17)
- javascirpt如何模仿块级作用域(js高程笔记)
- 《JS高程(3)》DOM2和DOM3-遍历-第12章笔记(24)
- javascirpt怎样模仿块级作用域(js高程笔记)
- 《JS高程(3)》DOM节点层次Document类型-第10章笔记(12)
- 《JS高程(3)》DOM节点层次Comment类型-第10章笔记(15)
- JS高程三第二章一二天笔记
- 关于JS高程的笔记(一到三章)
- JS高程第七章笔记 --函数表达式
- 《JS高程(3)》BOM-04(screen)-第8章笔记(09)
- JS高程第六章笔记(上)- 理解对象
- "红砖"JS高程笔记P1