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

时间:2023-03-08 16:52:47

相关阅读:https://segmentfault.com/a/1190000015438195

相关阅读: https://zhuanlan.zhihu.com/p/23804247

相关阅读: https://blog.****.net/qq20004604/article/details/53328724

函数内部有两个特殊的对象:this与arguments

【this】this引用的是函数执行的环境对象

(1) 作为对象属性被调用

此时,this指向调用该函数的对象obj

(2) 作为普通函数被调用

  此时,this指向全局作用域,非严格模式下this指向window,严格模式下this指向undefined

(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