1.function是对象、创建的也是对象引用
三种创建方式 最后一种不推荐
M1:
function func(){
alert("使用很普遍的函数创建方式");
}
M2:
var func=function(){
alert("直接储存在变量当中");
}
M3:
var func=function("参数1","参数2","参数n","alert("不要花括号,直接创建")");
2. 在代码运行之前,解析器经过 代码提升的过程 首先将函数声明创建出来 确保函数能够正常使用 再将声明函数提到顶部 然后执行
函数调用在函数创建之前,结果并不会出错。
var Vsum=sum(10);
alert(Vsum);
function sum(maxV){
"use strict"
for(var i=0;i<maxV;i++){
var sum+=0;
}
return sum;
}
另一种情况就会出错。
var Vsum=sum(10);
alert(Vsum);
var sum=function(maxV){
"use strict"
for(var i=0;i<maxV;i++){
var sum+=0;
}
return sum;
} //unexpected identifier
出错的原因就是因为函数创建位于顶部,但是函数的声明不是
3.函数内部拥有argument和this俩个特殊对象
argument是保存拥有它的函数的参数
argument拥有一个属性callee、它是一个指针 能够指向拥有argument对象的函数
这个方法可以用来解耦合 经典例子 递归实现阶乘
alert(factorial(10));
function factorial(Vmax){ //Vmax>0
if(Vmax<=1)return 1;
else{
return Vmax*factorial(Vmax-1);
}
}
利用arguments节耦合
alert(factorial(10));
funciton factorial(Vmax){
if(Vmax<=1)return 1;
else{
return Vmax*arguments.callee(Vmax-1);
}
}
但在严格模式下使用会出错
4. this对象 类似java和c#中的this 都是指向当前的作用域 当没有其他作用域时候 指向window 例子:
5. ECMAScript5还定义函数对象另一个属性caller、它保存着引用当前函数的函数的引用、如果为window则为null 实例:
除此之外、ECMAScript还为每个函数对象定义了length和prototype属性方法。length表示每个函数对象希望能接受几个参数 prototype则是真正保存着函数中所有实例方法真正所在 实际上toString和ValueOf都是保存在prototype名下 只是通过各自的实例对象调用罢了
每个函数都包含着非继承而来的方法 apply和call方法
apply和call方法都接受俩个参数
第一个参数都接收作用域this
第二个参数apply可以接收数组参数或者arguments(保存当前函数的参数) call则只能接收按顺序排列单个排列的参数
需要注意的是 apply和call最主要用作扩充函数的作用域、而非传递函数。
window.color="red";//全局属性
var o_bule={
color:"bule"
}
function toStringColor(){
console.log(this.color);
}
toStringColor.call(this);//red
toStringColor.call(o_bule);//bule
toStringColor().call(window); //red