面试题1:
function f(s){ console.log(this.a,s); //因为是apply,则为obj.f调用函数,那么this指的是obj, 则输出a为2;s接收的是arguments里面的参数3,则s为3; return this.a + s; } var obj = { a:2 } var f2 = function(){ //无形参接收 arguments:['0':3] //return f.call(obj,...arguments); //call作用也是使对象调用函数,但是传过去的是整个arguments,不是单单的数字3,所以用扩展符(相当于数组展开)
return f.apply(obj,arguments); //两个return效果一样,apply作用就是使obj对象调用函数 } var b = f2(3); //因为函数f2()没有形参接收,所以3存放到arguments中 console.log(b); //5
面试题2:
var n=123; function f1(){ console.log(n); //123 } function f2(){ var n=456; f1(); //作用域是window } f2(); console.log(n) //123
面试题3:
var length = 100; function f1(){ console.log(this.length); //作用域是window } var obj = { x:10; f2:function(f1){ f1(); 输出100 arguments[0](); arguments是数组,传过来的两个参数,那么arguments[0]就是f1 ,那么此时调用f1(),此时作用域是arguments,求数组长度,输出2 } } obj.f2(f1,1) //两个实参 输出100 2