JavaScript中的callee, caller, call

2018/08/29 21:39

callee, caller, call

1. callee

在函数内部,有两个特殊对象: arguments和this,arguments中保存着函数参数,这个对象还有一个 叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

function factorial (num) {
  if (num <= 1) {
    return 1
  } else {
    return num * arguments.callee(num-1)
  }
}

可以在函数内部使用arguments.callee获取这个函数的指针。
这样做的好处是可以降低函数的耦合度。

2. caller

这个属性中保存着调用当前函数的函数的引用。

function testCaller () {
    console.log(arguments.callee.caller)
}

function test () {
    testCaller()
}

test()
---------------
结果:
ƒ test() {
    testCaller();
}

3. call

当谈到call这个方法时,顺便可以提及apply方法。

这两个方法的用途都是在特定的作用域中调用函数,实际上就是设置函数体内this对象的值

3.1 apply

apply()方法接受两个参数
=> 1. 是在其中运行的函数的作用域
=> 2. 参数列表,[ Array实例 , arguments对象]

3.2 call

call()与apply()方法作用相同,但是接受的参数不同
接受的参数
=> 1. 是在其中运行的函数的作用域
=> 2. 其余参数都直接传递给函数

环境在node8 下
--------------------
this.a = 'windowName'
this.o = {a: 'oName'}

function getA() {
    console.log(this.a)
}

getA.apply(this) //windiwName
getA.apply(this.o) //oName

getA.call(this) //windiwName
getA.call(this.o) //oName

2018/08/29 23:05
=============================更新=======================
2018/09/01 22:00

4.补充一个bind()方法

The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.

        var nameTest = 'windowName'
        var a = {
            nameTest: 'aName',
        }
        function f1 () {
            console.log(this.nameTest)
        }

        f1() //windowName
        let f1Bind = f1.bind(a)
        f1Bind() //aName

综上所述呢, 通过js函数方法改变对象内部this指向有 apply, bind, call!

2018/09/01 22:16

你可能感兴趣的:(JavaScript中的callee, caller, call)