函数中的this与argument对象,以及argument中的callee与caller属性

相关阅读: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

相关文章
相关标签/搜索