// callee
function foo(a){
  console.log(a)
  
  if(a === 'again'){
    arguments.callee('again end')
    console.log(arguments.callee)
    console.log(foo)
    // 这里返回true,说明arguments.callee是指向foo函数的引用,所以完全一致。
    console.log(arguments.callee ===  foo)
  }
}
foo('again')


// caller
let obj = {
  f: function bar(){
    // 这里输出 null,应该是表示window对象的调用。
    console.log('obj.f()', bar.caller)
    // 这里输出undefined,所以这么看argument.caller的属性已经删除掉了
    console.log('obj.f()', arguments.caller)
  },
}
obj.f(1)

// 在函数中调用能够拿到调用者,全局状态下为 null
// http://www.jiazhengblog.com/blog/2009/12/27/48/
function a(){
  // 函数名.caller 能够拿到调用者
  console.log(a.caller);
  // 或者通过arguments.callee获取函数本身,在取得caller属性也能够拿到调用者
  console.log(arguments.callee.caller);
}

function b(){
  a(1);
}

b();

// arguments[@@iterator]

function bar(){
  console.log(arguments[Symbol.iterator])
  
  console.log(arguments[Symbol.iterator]())
  
  for(let item of arguments) {
    console.log('for of', item)
  }
  
  // 从最终的效果来看,for of arguments 和 for of arguments[Symbol.iterator]() 最终效果一致
  // for of能够自动转换迭代器
  for(let item of arguments[Symbol.iterator]()) {
    console.log('for of', item)
  }
}

bar(1,2,3,4)

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.