javascript忍着秘籍笔记
函数调用传递的两个隐式参数argument,this
隐式:意味着这些参数不会显示列在函数签名里,但是它们默默地传递给函数并存在函数作用域内。
在函数内部他们可以像卡显示命名参数一样使用
如果在你浏览器中调试时,你就会发生他们是真实存在对象中的
arguments参数
他只是一个类数组,只是拥有部分特性,你能数组形式去获取(arguments[0]得到第一个参数),也能for循环遍历,但他就不是数组
this参数
this称为调用者的上下文
而函数调用几种方式呢?
- 作为一个函数进行调用,是最简单的形式。
- 作为一个方法进行调用,在对象上进行调用,支持面向对象编程。
- 作为构造器进行调用,创建一个新对象。
- 通过apply()或call()方法进行调用,这种方式很复杂,遇到的时候我们将会再讨论
作为一个函数进行调用,是最简单的形式。
一般情况下,也是这种用法
如:
function ninja(){};
ninja();
而他们的this,也就是window
作为一个方法进行调用
而还有一种就是作为函数中的方法被调用,这个时候this是函数
如:
var creep=function ninja(){};
var sneak={
skulk:creep
}
sneak.skulk();//skulk的this就是sneak对象
作为构造器进行调用
构造器被调用的时,就会发生下面行为:
创建一个新的空对象
传递给构造器的对象是this参数,从而成为构造器的函数上下文
如果没有显示的返回值,新创建的对象则作为构造器进行返回
作为构造器进行调用,this就是该对象
function Ninja(){
this.skulk=function(){
return this;
}
}
var ninja1=new Ninja();
assert(ninja1.skulk()===ninja1);//通过
使用apply()和call()方法进行调用
在函数调用的时候,javascript为我们提供了一种方式,可以显示指定任何一个对象作为其函数上下文,javascript的每个函数都有apply()和call()方法
apply()传入两个参数:
函数上下文的对象
作为函数参数所组成的数组
Call()方法使用方法类似,唯一不同的是给函数传入的参数是一个参数而不是列表,而不是单个数组
例子:
function juggle(){
var result=0;
for(var n=0;n<arguments.length;n++){
result+=argument[n];
}
this.result=result;
}
var ninja1={};
var ninja2={};
juggle.apply(ninja1,[1,2,3,4]);
juggle.call(ninja2,1,2,3,4);
assert(ninja1.result===10);//通过
assert(ninja2.result===26);//通过
从最后的测试可以看出:结论是正确的
ninja1和ninja2把上下文给传进去了
而juggle方法也成功在上下文添加了一个result
当然最后的计算结果也是一样的