JavaScript 4.1 函数高级-理解函数

JavaScript 4.1 函数高级-理解函数

 

JavaScript中变量可以分为两类:基本类型和引用类型(有时也称对象)。其中数值、字符串、布尔值、nullundefined属于基本类型;对象、数组和函数属于引用类型(对象)
  基本类型在内存中具有固定的内存大小。例如:数值型在内存中占有八个字节,布尔值只占有一个字节。对于引用型数据,他们可以具有任意长度,因此他们的内存大小是不定的,因此变量中存储的实际上是对此数据的引用,通常是内存地址或者指针,通过它们我们可以找到这个数据。

 

ECMAScript中,函数是对象,每个具体函数都是Function对象的实例。函数可以作为变量来使用,变量名作为指向函数的指针来使用。

 

1.函数定义:

函数声明法:

function functionname(){···}   //没分号

函数表达式:

var x = function(){···};         //有分号

1:函数可以没有函数名,如function(){}; 被称为匿名函数。可以运行,在onclick中常用。但是没有办法被再次引用,没有名字嘛,就没有指向这个函数的指针。

2:在函数表达式中,将函数赋给变量xx保存的是函数指针。与函数声明中的functionname是一样的。

3:在JavaScript中,函数定义里可以嵌套函数定义。而这在C语言中是不允许的。

例如1

function Func1(){
  ····
  function Func2(){
  ···
  }
}
// 当调用函数: Func1(); 的时候, Func2() 是不执行的。因为在 Func1() 里,只是定义了 Func2

例如2

function Func1(){
  var num=0;
  return function(){
    return num;
  };
}
alert(Func1());   //结果显示:function(){return num;}
alert(Func1()());  //结果显示:0
4 :函数声明与函数表达式的区别只有一点:函数声明可以函数声明提升,意思就是在执行代码前先读取函数声明。例如:

sayHi();   //没有问题
function sayHi(){···}    
 
sayHi();   //错误,函数还不存在
var sayHi = function(){···};

 

2.函数名的使用:

function sum(num1,num2){
  return num1+num2;
}
var x1=sum;
sum(1,2);   //3
x1(1,2);   //3
 
var display = function(){alert("Hello World!")};
x2=display;
display();   //Hello World!
x2();   //Hello World!
 
var object = new Object();
object.m = sum;  //给对象object定义了m()方法。
object.m(1,2);   //3
注:函数名作为指针可以任意赋值,函数名 () 表示调用指针指向的函数。

 

3.函数的使用:

①作为值

function aaa(){
  return 10;
}
var x = aaa();   //x = 函数的返回值10
 
function aaa(){
  return aaa;
}
var x = aaa();   //x = 函数的返回值aaa,即函数指针。
 

作为函数的返回值

function Func1(){
  var num=0;
  return function(){
    return num;
  };
}
alert(Func1());   //结果显示:function(){return num;}
alert(Func1()());  //结果显示:0

③作为构造函数

function person(name,age)  {  
  this.name=name;  
  this.age=age;  
  }  
var myFather = new person("John",50);  //结果:创建myFather.name="John",myFather.age=50
alert(myFather.age);  //50
 
function test(){
  this.x = 1;
}
var o = new test();  //结果:创建o.x=1
alert(o.x);    // 1


4.指向函数的指针arguments.callee

在保存函数参数的对象arguments中有一个名叫callee的属性,该属性是一个指针,指向函数。等同于函数名。

//在递归函数中,函数通过函数名调用自身:
function multiple(num){
  if(num<=1){
    return 1;
  }else{
    return num*multiple(num-1);
  }
}
//因为在函数中用来multiple这个函数名,当:
var a = multiple;
multiple = null;
a(4);  //出错。
//为了消除这种紧密耦合的现象,可以:
function multiple(num){
  if(num<=1){
    return 1;
  }else{
    return num*arguments.callee(num-1);
  }
}
//缺点:在严格模式下,不能使用arguments.callee,解决方法:
var multiple = (function f(num){
  if(num<=1){
    return 1;
  }else{
    return num*f(num-1);
  }
});
//解释:这是模仿块级作用域。

 

5.模仿块级作用域

JavaScript 没有块级作用域的概念,在 if for while 等中定义的变量是全局变量。比如我们写了一点 JavaScript 模块代码,需要放在不同 JavaScript 程序中,我们需要几个局部变量 ( 比如中间变量 ) ,我们需要模仿块级作用域。

解决方法:将代码放在一个函数中。

方法1

function mymodule(){

  ···一段代码

}

mymodule();  //不要忘了调用函数

方法2推荐

( function(){

  ···一段代码

} ) ()

理解:

用函数表达式时,var x=function(){}; x(); function(){···}看成x()防止JavaScriptfunction关键字作为函数声明的开始。

方法3

( function(){

  ···一段代码

} () )

理解:

()表示立即执行,()防止JavaScriptfunction关键字作为函数声明的开始。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值