arguments是什么
答:是一个长的很像数组的对象。
arguments内容是什么
答:是函数运行时的实参列表。
(function(d,e,f){
console.log(typeof arguments);
console.log(arguments);
console.log(arguments[3]);
arguments[0] = 'china';
console.log(d);
console.log(arguments.length); // 4
})('hello','world','!','haha');
// 真正收到的实参个数,在多态或函数重载里可以用到
// arguments收集了所有的实参,即使没有与之相对应的形参。
arguments.callee属性
//arguments.callee属性代表当前运行的函数。
(function(d,e,f){
console.log(arguments.callee);
})('hello','world','!');
使用callee进行递归:
function t(n){
if(n==1){
return 1;
}else{
return n+t(n-1);
}
}
alert(t(100))
// 使用callee改写
alert((function t(n){
if(n==1){
return 1;
}else{
return n+arguments.callee(n-1);
}
})(100));
//如果是匿名函数,又不许使用callee,也要完成递归,怎么办?提示:V算子
/**
*函数运行期内,关键的三个对象:
*AO -->本函数AO上没有某属性,则继续去外层的AO上寻找,直到全局对象,叫做AO链(作用域链)
*arguments-->每个函数都有自己的callee,但不向外层寻找arguments的相关属性,不形成链
*this-->那个对象实例调用this所在的函数,那么this就代表那个对象实例
*/
this的四种调用方式
1.普通函数来调用
this的值指向->window
准确的说this为null,但被解释为window
在ECMAscript5标准中,如果this为null,则被解释为undefined。
alert(window.x);
function t(){
this.x=333;
}
t();
alert(window.x);
2.作为对象的方法来调用
this作为对象的方法来调用,this指向方法的调用者,即母体对象。
var obj={xx:999,yy:888,t:function(){alert(this.xx);}};
obj.t();//999
var dog={xx:'wangwang'};
dog.t=obj.t;
dog.t();//wangwang
show=function(){
alert(this.xx);
}
dog.t=show;
dog.t();//wangwang
3.函数作为构造函数调用时
js中没有类的概念,创建对象使用构造函数来完成的,或者直接用json格式{}来写。
function Dog(name,age){
this.name=name;
this.age=age;
this.back=function(){
alert('This is '+this.name+'!');
}
}
var dog = new Dog('huzi',2);
dog.back();
// new Dog 发生了以下几个步骤:
a:系统创建空对象{},(空对象constructor的属性指向Dog函数,)
b:把函数的this指向该空对象Dog
c: 执行该函数
d:返回该对象
//下面返回什么?
function Pig(){
this.age=99;
return 'abc';
}
var pig = new Pig();
console.log(pig);
//pig对象,因为函数作为构造函数运行时,return的值是忽略的,还是返回对象。
4.函数通过call,apply调用时
语法格式:函数.call(对象,参数1,参数2···参数n);
function t(num){
alert('我的真实年龄是'+this.age);
alert('但我一般告诉别人我'+(this.age+num));
}
var humen = {name:'yike',age:23};
humen.t = t;
humen.t(-10);//this指向humen,但是humen多了一个方法属性
//接下来,我们不把t赋值给humen的属性,也能把this指向humen。
var wangwu = {name:'wangwu',age:30};
t.call(wangwu,5);
/*fn.call(对象,参数1,参数2···参数n);
*运行如下:
*a:fn函数中的this指向对象obj
*b:运行fn(参数1,参数2···参数n);
*/
this练习题
name = 'this is window';
var obj = {name:'php',t:function(){alert(this.name)}};
var dog = {name:'huzi'};
obj.t();
dog.t=obj.t;
dog.t();
var tmp = dog.t;
tmp();//this is window 相当于window.tmp()
(dog.t = obj.t)();//this is window
dog.t.call(obj);
//(dog.t = obj.t)任何表达式都有返回值,所有它的返回值是“值”,即t函数
//强调是值,说明不是通过引用来调用的,而是立即使用函数本身
//效果等同于(function(){alert(this.name)})();立即调用,立即执行,执行完就扔
//this指向null,null又被解释称window
问:this操作的函数(如this.age=xx;)不能直接调用,需要new一下,然后调用。
答:因为直接调用,this指向window,将会污染全局。