JavaScript基础之八(functions和闭包)

1.function的调用有四种方式:①普通函数调用  ②作为方法调用(函数作为对象的属性成为方法)  ③构造函数调用  ④call,apply方法来调用

 

2.this是javascript的关键字,this没有作用域,跟调用的函数有关系,或者在严格模式为undefined。嵌套的函数this不指向外部函数。如下代码:

运行结果:

这里需要注意一个地方,在m的内部调用嵌套函数f(),this指向的是window,并不是o,this只跟调用有关系,这里指向window,表明上看好像是window调用。其实如果改成window.f()来调用,这里会报错window.f not defined,这里需要注意下.

 

3.arguments.callee:指向当前运行的function,匿名函数需要递归调用时可以使用,在ES5严格模式下不能使用。

 

4.arguments.caller:这个属性已经废弃,不要再使用了。主要执行调用的函数。

 

5.闭包:函数对象与函数包含的变量作用域的组合就是闭包。关键词就是函数对象和作用域。从技术讲,所有的javascript函数都是闭包,因为它们是对象而且有作用域。大多数函数调用时使用就是定义时候的作用域链,所以不是很引人注目。闭包在函数嵌套里面开始有点意思,平时基本会忽略,因为函数嵌套产生了不同的作用域。理解闭包一个最基本的原则就是函数在执行的时候使用的是定义时候的作用域链。例如:

上面两段代码执行的结果都是一样的,说明闭包里面作用域只跟定义的时候有关系,跟在函数里面调用函数还是在函数外面调用函数没有关系。每当我们调用函数时,就会创建一个新的对象来存放一些local的变量,这些变量需要调用时使用的。这个对象(变量绑定的对象)会被添加到作用域链里面,当函数返回时,这个对象就会从作用域链里面移除。如果没有其他引用到这个变量,就会被GC。如果定义了嵌套函数,并且返回一个嵌套函数或者把嵌套的函数存放到一个属性里面。这样就有一个外部的引用。,那么这个嵌套的函数不会被GC,而且对象也不会被GC。

 

6.闭包的一个例子代码

理解闭包基础中的基础就是:词法作用域, 函数调用时候的作用域是使用的该函数定义时候的作用域

 

7.函数的length属性:表示函数在定义的时候期望的参数个数(就是在括号里面的参数个数)

 

8.bind方法:把函数绑定到对象,其实就是改变了函数的this指向,bind方法会返回一个新的函数。代码说明如下:

 

9.函数的定义方式new Function()和function关键字。通过new Function构造的函数不遵循词法作用域,而是全局的。尽量避免使用

 

10.高阶(High-Order)函数:把函数作为参数并且返回一个函数。

 

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

发表评论

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