varA=function(){}A.prototype.n =1var b =newA()A.prototype ={
n:2,
m:3}var c =newA()
console.log(b.n,b.m,c.n,c.m)// 1 undefined 2 3
测试题2
functionF(){}
Object.prototype.a=function(){
console.log('a()')}
Function.prototype.b=function(){
console.log('b()')}var f =newF()
f.a()//a()
f.b()//报错F.a()//a()F.b()//b()
作用域与执行上下文
区别1
全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定,而不是在函数调用是
全局执行上下文环境实在全局确定之后,js代码马上执行之前创建
函数执行上下文是在调用函数时,函数体代码执行之前创建
区别2
作用域是静态的,只要函数定义好了就一直存在,且不会再变化
执行上下文是动态的,调用函数时创建,函数调用结束时上下文环境就会被释放
联系
上下文环境(对象)是从属于所在的作用域
全局上下文环境==>全局作用域
函数上下文环境==>对应的函数使用域
闭包
如何产生闭包?
当一个嵌套的内部(子)函数应用看嵌套的外部(父)函数的变量(函数)时,就产生了闭包
闭包到底是什么?
使用chrome调试查看
理解1:闭包是嵌套的内部函数(绝大部分人)
理解2:包含被应用变量(函数)的对象(绝少数人)
注意:闭包存在于嵌套的内部函数中
产生闭包的条件?
函数嵌套
内部函数应用了外部函数的数据(变量/函数)
闭包的作用
使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)
让函数外部可以操作(读写)到函数内部的数据(变量/函数)
问题:
函数执行外后,函数内部生命的局部变量是否存在?一般是不存在,存在于闭包中的变量才可能存在
在函数外部能直接访问函数内部变量吗?不能,但我们可以通过闭包让外部操作它
闭包的生命周期
产生:在嵌套内部函数定义执行完时就产生了(不是在调用)
死亡:在嵌套的内部函数成为垃圾对象时
functionfn1(){//此时闭包就已经产生了(函数提升,内部函数对象已经创建了)var a =2functionfn2(){
a++
console.log(a)}return fn2
}var f =fn1()f()f()
f =null//闭包死亡(包含闭包的函数对象成为垃圾对象)
闭包缺点
函数执行后,函数内的局部变量没有释放,占用内存时间变长
容易造成内存泄漏
解决:
能不用闭包就不用
及时释放
闭包面试题
functionfun(n,o){
console.log(o)return{
fun:function(m){returnfun(m,n)}}}var a =fun(0)
a.fun(1)
a.fun(2)
a.fun(3)//undefined,0,0,0var b =fun(0).fun(1).fun(2).fun(3)//undefined,0,1,2var c =fun(0).fun(1)
c.fun(2)
c.fun(3)//undefined,0,1,1