JS面向对象--4函数的上下文之小题目

题目一

function fn(){
  alert(this.a);
}    
var obj= {
  "a" : 1,
  "b" : 2,
  "c" : [{
    "a" : 3,
    "b" : 4,
    "c" : fn
  }]
}
var a =5;
obj.c[0].c()      //3  函数的最终调用者  规律二
//对象.方法()

题目二

function fun(m,n,o,p,q,r){
  alert(this.length);
}
function f(a,b){
  arguments[0](9,10,11,12);
}
f(fun,5,6,7);  //4

正确答案是4 这是一个标准面试题.
首先说说什么是arguments.callee.在函数内部 如果想得到函数自身,用this是不可能的,就得调用arguments.callee
函数的最终调用 ,是arguments对象进行方括号索引得到这个函数,然后加圆括号调用了,所以符合规律2或者 规律 5.如果你认为arguments是对象,此时规律2第一次。如果你认为arguments是数组,也没事,规律5生效,此时无论如何,函数fun里面的this是argument对象

function fun(){
  console.log(arguments.callee === fun);   //true
}
  fun()
  //弹出true

  function fun(a,b,c,d,e,f){  //形参
  console.log(arguments.callee.lenght);   //6
  console.log(arguments.lenght);   //3
}
  fun(88,86,99) //实参

函数的length是什么呢 函数的长度是形参列表的长充 就是函数定义的时候 写在fun()圆括号里的字母个数,无视你的实参个数
也就是说 arguments.callee.length就是形参列表的个数
而arguments.length表示实参个数,就是调用函数的时候传进来的实参个数

function fun(m,n,o,p,q,r){
  alert(this.arguments.length);
}
function f(a,b){
  arguments[0](9,10,11,12);
}
f(fun,5,6,7);  //2

你可能感兴趣的:(JS面向对象--4函数的上下文之小题目)