相关阅读:https://segmentfault.com/a/1190000015438195javascript
相关阅读: https://zhuanlan.zhihu.com/p/23804247java
相关阅读: https://blog.csdn.net/qq20004604/article/details/53328724segmentfault
函数内部有两个特殊的对象:this与arguments数组
【this】this引用的是函数执行的环境对象app
(1) 做为对象属性被调用函数
此时,this指向调用该函数的对象objthis
(2) 做为普通函数被调用spa
此时,this指向全局做用域,非严格模式下this指向window,严格模式下this指向undefined.net
(3) 做为构造函数被调用指针
此时,this指的就是将要被new出来的新对象
(4) call()、apply()、bind()的应用 —— 做用:扩充做用域,优势在于方法与对象不须要任何耦合关系!
每一个函数都包含两个非继承而来的方法call()与apply(),这两个方法的用途都是在特定的做用域中调用函数,实际上等于设置函数体内this对象的值。
此外,ES5中还定义了一个bind()方法。
【apply()方法】接受两个参数,一个是在其中运行函数的做用域(即this),另外一个是参数数组
【call()方法】接受多个参数,第一个也是this,其他参数直接传递该函数,而非放到一个数组中传递给call()
【bind()方法】用于将当前函数和指定对象绑定,返回一个新的函数,当新函数被调用时,代码会在指定对象的上下文中执行。
【arguments】 其中arguments是一个数组类对象,包含传入函数的全部参数。
虽然arguments的主要用途是保存函数参数,
可是这个对象还有一个名叫【callee】的属性,该属性是一个指针,指向拥有这个arguments对象的函数。 表示引用当前正在执行的函数,或者说是调用arguments.callee的函数对象的引用,它给匿名函数提供了一种自我引用的方式。
(1) 这个属性只有在函数执行时才有效
(2) 它有一个length属性,能够用来得到形参的个数,所以能够用来比较形参和实参个数是否一致,即比较arguments.length是否等于arguments.callee.length
(3) 它能够用来递归匿名函数。
ES5中也规范化了另外一个函数对象属性【caller】,这个属性中保存着调用当前函数的函数的引用,若是是在全局做用域中调用当前函数,它的值为null
(1) 这个属性只有当函数在执行时才有用
(2) 若是在javascript程序中,函数是由顶层调用的,则返回null