本节是对语言精粹第四章的一些总结和精华梳理,因为这一章主要是说明函数这个js中的一等公民的,所以专门抽出一节来希望把这个部分说透。
第四章
函数对象,函数对象也是一个对象之中,函数对象在创建中会产生一个prototype属性。
函数字面量,通过函数字面量创建的函数对象包含一个连到外部上下文的连接,这被称为闭包。这是js强大表现力的来源。
函数调用方式,函数一共有四种调用方式,这四种调用方式在初始化this这个关键参数上存在差异:
1. 方法调用模式
2. 函数调用模式
3. 构造器调用模式
4. apply调用模式
对于1、方法调用模式,简单说this对象指向调用的者,ex:
js code:
var x = {
value: 0,
call: function() {
console.log(this.value);
}
}
x.call();// 0,此时this指向x
对于2、函数调用模式对于函数调用模式上,this将会被绑定到全局对象上,书中说这是一处设计失误,不过我觉得可以这样理解,当函数调用模式中,可以理解为调用函数为window.x,所以在此模式下指向window,ex:
js code:
function x() {
console.log(this);
}
x();//window
对于3、构造器模式,在此模式中,this将指向被new函数实例化后的函数,ex:
js code:
var X = function() {
this.zak = ‘wu‘;
}
X.prototype.getName = function() {
console.log(this.zak);
}
// 实例化
var x = new X();
x.getName();// ‘wu‘;
对于4、apply调用模式,在此模式中,this将是调用时传入的绑定对象,也就是apply(call)传入的第一参数,ex:
js code:
var X = function() {
this.zak = ‘wu-X‘;
}
var y = {
zak: ‘me-Y‘
}
X.prototype.getName = function() {
console.log(this.zak);
}
// 实例化
var x = new X();
x.getName.apply(y);// ‘me-Y‘;
函数参数,函数的参数当实参数量不等于形参时,将不会产生运行时错误。当实参数量多时,多的参数将会被赋值为undefined,当实参数量少时,未传入参数将会被赋值为undefined。当函数创建时,将会传入arguments作为默认属性,arguments是一个类数组对象,他有length,但是没有数组相应的一系列方法。可以通过[].slice.call(arguments)
将其转换为真正的数组。
函数返回,当函数执行到return语句时将会返回,当没有return语句时将返回undefined,这里有一个特例,如果在函数调用时在前面加上了new前缀,且其返回不是一个对象时,将会返回this。
当然,本章的内容很多,比如递归,记忆,模块等等各种编码方案,或者说是最佳实践,写的都很棒,值得细读。
更多内容请查看zakwu的小站