JavaScript高级编程 5.5-6

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

另一种情况就会出错。

var Vsum=sum(10);
alert(Vsum); 
var sum=function(maxV){
  "use strict"
  for(var i=0;i
出错的原因就是因为函数创建位于顶部,但是函数的声明不是

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

你可能感兴趣的:(JavaScript高级编程 5.5-6)