通过嵌套形式的闭包保持对象状态以及对象扩展

javascript中的基础类型(primitive)和字面值(literal)的区别

基础类型有这5种:Number,String,Boolean,null,undefined

字面值:一个可以代表具体类型的值(基础类型中的一种)

创建字面值:var str1=”Hello World”; var num1=123; var flag1=true;

创建基础类型:var str2=String(“Hello World”); var num2=Number(123); var flag2=Boolean(true);

创建对象:var str3=new String(“Hello World”); var num3=new Number(123); var flag3=new Boolean(true);

注:str1===str2,但是str1!==str3 (对象是引用类型)

 

提取字符串(This is a list of languages:javascript, C#, java, php.)==》[“javascript”, “C#”, “java”, “php”]

 

判断一个变量非空字符串

 

把decimal转换为16进制等

 

创建一个函数并且可以保存自己的状态

通常情况下,我们可以使用定义一个全局变量来实现(比如对一个变量的累加)。全局变量有可能被污染或者被其它的代码覆盖,这里使用闭包的方式,并且可以再次理解闭包。代码说明:

之前有说过,闭包并不是嵌套的函数才有,javascript所有的函数都是闭包。只是在嵌套的函数里面才有点作用,有点意思。从上面的代码看,返回的add函数内部引用了外层函数的参数a。这里要清楚之前的一个概念(函数作用域scope),因为add函数存在于calc函数的内部,也就是说在calc函数的作用域内。所以这个时候add函数可以访问calc外层函数的变量或参数,但是calc无法访问add的参数b。

 

tips:其实这里可以刷新我们对全局变量的认识,变量的作用域都是相对的,javascript里面有一个最外层的作用域,这个作用域是在程序运行环境创建的。所有的全局变量和定义的函数都是在这个作用域下的。当我们创建一个函数,就创建了一个作用域。闭包的内层函数的引用的外层函数的变量值会被保持,至于为什么保持可以从引用的关系来理解,add在最外层作用域引用了calc的a参数,这个参数如果没有被外面的引用,自然在使用完就释放了,不会保持。那问题来了,通过什么方式可以让一个函数内部的变量或参数被外面的引用呢?嵌套函数就是解决了这个问题,为什么能解决了,这得说道javascript的词法作用域,前面的文章提到了。词法作用域意味着在定义的时候就确定了作用域。当然闭包最好在自己知情的情况下使用,否则会有内存泄漏的风险。现在的浏览器大都能处理这个问题,不至于消耗过多内存。这里有一种做法,就是jQuery里面用的,使用一个匿名函数(自执行)封装整个代码块,这样达到了定义全局变量,但是有不污染的效果

 

如何使用内存缓存提高程序性能(斐波拉契为例)

计算结果如下:

这个里面的有一个很关键的就是要保存已经计算过的值,使用闭包。否则没有效果,每次仍然去计算到了斐波拉契的第一项。

 

定义对象的私有成员

在对象内部(构造函数)定义的变量,不能外面访问。

 

自定义字符串的trim方法(这个方法在ES5里面已经实现)

\xA0表示不换行的空格

 

Object.create来继承其它对象的原型

Object.create:创建一个新的对象,第一个参数就是新对象的原型。例如:

一个对象(构造函数)要继承另外一个对象的原型的方法

 

给一个对象扩展属性Object.defineProperty

 

阻止对象扩展属性Object.preventExtensions(obj)

 

禁止给对象做任何更改Object.freeze(obj)

javascript
作者:张雪飞
出处:https://zhangxuefei.site/p/949
版权说明:欢迎转载,但必须注明出处,并在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

发表评论

电子邮件地址不会被公开。 必填项已用*标注