对于作用域问题:只管在哪个环境中创建的,不管是在哪个环境中调用的,
不管在哪个环境中调用,最终都要回到创建他的环境中执行;
变量查找: 从内到外
内部函数的作用域 包含了外层函数的 作用域
(只能访问到自身作用域和全局作用域)
最佳实践: 只在全局环境中使用new Function,
因为:在函数内部创建函数,只能访问到自身作用域 和全局作用域
运算符的优先级:
new : 带参数列表 高于 不带参数列表
命名冲突::
1.两个变量命名冲突; (函数表达式)
重复的声明无效; var num; var num;//无效 num=123; num=345;
2.两个函数命名冲突;
后面覆盖前面
3.一个函数与一个变量命名冲突:
3.1 如果是在变量赋值之前访问的变量的值,那么此时的值为:函数
3.2 在变量赋值之后访问变量的值.那么此时的值为 :变量的值
var fn ;
function fn(){console.log('函数')};
console.log(fn) ===> 函数
fn=123;
console.log(fn)//123
4.函数 参数与变量命名冲突:
可以认为:函数的参数是最先被提升的
重复声明的变量无效,但是对于函数来说,会把函数的值覆盖掉
没有赋值之前:
如果一个变量与参数命名冲突:此时结果为参数的值;
如果一个函数与参数命名冲突 此时结果为 函数
赋值之后:
此时的值就是刚刚的值;
____________________________________________________
闭包的介绍:: closure (词法闭包 / 函数闭包)
在函数内部声明的变量在函数外部无法访问到,因此,我们就是这个函数
构成了一个闭包;
__________
从广义上来看:
js中所有的函数都能够形成了一个闭包;
闭包有两部分组成:
1.函数体
2.函数所处的环境(作用域链)
把函数体以及函数所处的环境所构成的一个综合体 称为:闭包
_________
从狭义来看:
var fn =function(){ var foo=functiong(){} return foo;} //闭包模型
一个函数中返回了另外一个函数,这是最常用的闭包模型;
_______
理解闭包:
1.只看函数是在哪个环境中被创建的,不管函数是在哪个环境中被调用的
2.不管在哪个环境调用的,最终都要回到创建它的环境中来执行代码;即便离开
创建它的环境,也不例外;
foo 的作用域链 : foo 自身-->函数fn的作用域 -->全局作用域(可省略)
闭包的作用:
1.对函数内部的变量起到了保护的作用;
实现对变量的读取和设置
1.对变量起到保护的作用
2.能够读取变量的值;
3.能够设置变量的值
外层函数的作用:保护变量
内部函数的作用:操作变量
闭包可以运行多个实例;
多个实例之间是不会相互影响的;
函数调用时需要占用内存的,js解析引擎会为每一次调用分配一块内存;
并且两块内存是不会相互影响的!
闭包占用的内存会一直占用的,是不会释放掉的;(直到关闭应用)
普通函数,函数调用的时候也会占用内存,但是,函数调用的时候函数占用的
内容就会被释放掉;
javascript 是通过内部的垃圾回收机制,自动定期回收机制
函数fn调用占用的内存,为什么没有释放掉;
因为内部函数对外层函数的作用域存在一个引用;也就是引用了外层函数的
内存,因为外部函数产生的内存有一个引用,js垃圾回收机制就不会回收这块
内存
手动释放闭包占用内存; test=null // 设置为null 就行了
这样处理以后就没有任何标量在指向闭包占用的内存了,就会被回收
有两块内存:
1.创建函数占用内存;
2.函数调用的时候会占用内存;
内存释放,是把函数调用占用的内存释放掉;
使用缓存:cache 解决斐波那契数列大量重复计算的问题
缓存的作用:提高程序运行的效率
赋值表达式,是由等号右边决定的;
__________________________________________
沙箱模式:: (fucntion(){})(); //自调用函数
作用:为了减少全局污染问题
就是利用函数作用域的特点,因为在函数内部创建的变量,
在函数外部无法访问到, 也就是对全局环境起到保护作用;
为什么使用自调用函数??
1.要有作用域(因为只有函数能够提供,所以需要函数)
2.函数不调用函数内部的代码是不会执行的;
(function(){ 代码 })()
需要将 jQuery 暴露到全局环境中才能使用
(function(window){ 代码 })(window)
window.jQuery= window.$ = jQuery
添加给window的属性,就相当于创建一个全局变量
// 将window作为参数传入:
1.减少作用域的查找;
2.有利用代码的压缩;
自调用函数有一个专业的名字:
LLFE 立即 执行 函数 表达式
___________________________________________
逗号运算符,返回逗号右边的值
笔记连载中 , 纯手打 , 个人笔记 , 不喜勿喷 ,欢迎改正!