TOP

函数3---arguments对象

  arguments比较怪异,是个数组形式的对象,可以通过下表索引,比如arguments[0],arguments[1]等,但是它不是Array类型

typeof( arguments )  // Object
arguments instanceof Array //false
arguments instanceof Object //true

  

  题目一:

var employee = "Tom"
function getInfo(){
    console.log(this.employee)      
}

var person = {
    employee:"Jack",

    getInfo:function(fn){
         fn();
         arguments[0](); // arguments对象调用fn,相当于obj.fn()形式 ;(第一次见这种形式,有点不习惯);
    },
};    

person.getInfo( getInfo, 2 );

//输出结果
“Tom”
undefined

 

   细细体会,这个题目在考察 "函数执行时,this指向" 问题;关于this指向,请记住:哪个对象(上下文)调用了函数,这个函数中的this就指向谁;如果没有对象调用,this默认指向window(非严格模式下);跟函数在哪里定义无关;

  分析:

    在执行 fn()时,没有对象调用fn,在非严格模式下,fn中的this指向window;(严格模式下,此时this为undefined);

    在执行arguments[0]()时,arguments对象调用了fn,因此fn函数的this指向arguments对象,而不是person或者window;而arguments对象中没有employee,所以输出undefined

 

  题目二:

var employee = "Tom"
function getInfo(){
    console.log(this.employee)      
}

var person = {
    employee:"Jack",

    getInfo:getInfo,
};    

person.getInfo();
//输出结果
"Jack"

  细细体会,这两个题目在考察 "函数执行时,this指向" 问题;关于this指向,请记住:哪个对象(上下文)调用了函数,这个函数中的this就指向谁;如果没有对象调用,this默认指向window(非严格模式下);跟函数在哪里定义无关;

  题目二中,是person调用getInfo,所以这个函数的this指向person;

 

  arguments 的长度问题

function Test(a,b,c){
    console.log(arguments)
}

Test(1,2)// 此时 arguments.length =2 而不是 3; arguments表示的是实参,而不是形参;

   区分函数长度、arguments长度; Test.length 为 3,表示形参长度; arguments.length表示实参长度

 

posted @ 2017-04-27 11:55  RocketV2  阅读(195)  评论(0)    收藏  举报