1、"Methods" are just functions that are assigned to a property of an Object.
举例:
var slideshow = function() {
init: function() {
this.start();
},
start: function() {
},
};
window.onload = slideshow.init; // 调用this.start()时,this就是window对象
2、call和apply功能基本相同,但是差异在于二者的传参方式,如下(foo是一个函数):
foo.call(obj, arg1, arg2) == foo.apply(obj, arguments)
即apply第二个参数是一个参数数组。其中obj是调用foo函数的对象。
根据第一点,在JavaScript中执行某个对象的方法时,此时this指针不一定就是那个对象,而必须根据具体是哪个对象正在调用当前方法来确定。
call和apply正是利用了这点。
3、arguments — 另外一种获取函数参数的灵活方式
简单写了个Demo,如下:
function add(a, b) {
for(var v in arguments) { // v是参数索引,从0开始
console.log(arguments[v]);
}
}
add(3, 4); // 输出 3 4
add(3, 4, 5); // 输出 3 4 5
function add2() {
for(var v in arguments) { // v是参数索引,从0开始
console.log(arguments[v]);
}
}
add2(3, 4); // 输出 3 4
add2(3, 4, 5); // 输出 3, 4 5
上面可以看出JavaScript的函数参数并没有严格的限制。对于function add(a, b),a、b更多地只是标识该函数有两个参数,且通过正确命名a、b来增强代码可读性。
即使这样,我们仍然可以不按照它的要求来传参数。
总的来说使用arguments极大地增强了给函数传参的灵活性。
4、arguments的具体应用:
jQuery的很多API函数都提供了可选项参数(通过诸如{age:'22', sex:'male'}这样的对象提供),这个的实现就是通过arguments,下面是另外一个简单的佐证Demo(来自SlideShare.net
function validate() { var options = {}; var fields = arguments; // steal slice from Array.prototype var slice = Array.prototype.slice; if(typeof fields[fields.length-1] == 'object') { options = fields[fields.length-1]; fields = slice.call(fields, 0, fields.length-1); } console.log("Fields: "); for(var fKey in fields) { console.log(fields[fKey]); } console.log("Options: "); for(var oKey in options) { console.log(options[oKey]); } } validate('name', 'email'); // 没有配置项 validate('name', 'email', {min: 4, max: 10}); // 有配置项
当然如果要做得更完善,可以提供一个默认配置项对象,这样当调用方不提供配置项对象时,就使用默认配置项。
但是注意通过arguments访问参数列表只能通过索引,而不能通过参数标识符(即参数名)。