js函数

最新更新: 2019-09-02 14:21:02 阅读: 76次

1、函数和变量作用域

   函数是已命名的代码段,代码段中的语句作为一个整体来引用和执行。函数可以使用它来传递数据,也可以不适用参数。参数可以用“return” 语句返回确切的值,也可以不返回任何值。函数通过代码和功能的独立建立模块化,是程序变得结构清晰。函数就好像一个功能独立的电器元件,接受一定的输入,进行处理后给出相应的输出或完成特定的功能。

    JavaScript中的函数就是对象。对象字面量产生的对象连接到Object.prototype。函数对象连接到Function.prototype(该原型对象本身连接到Object.prototype)。每个函数在创建时会附加两个隐性属性:函数的上下文和实现函数行为的代码

   因为函数是对象,所以它们可以像任何其他的值一样被使用。函数可以保存在变量、对象和数组中。函数可以被当做参数传递给其他函数,函数也可以再返回函数。而且,因为函数是对象,所以函数可以拥有方法。

   函数的与众不同在于它们可以被调用。

2、函数字面量

函数对象通过函数字面量来创建


var bar = function (a,b){
   returen a+b;
};
函数字面量包括4部分。第1部分是保留字function。


第2部分是函数名,它可以被省略。函数可以用它的名字来递归调用自己。此名字也能被调试器和开发工具用来识别函数。如果没有给函数命名,比如上面这个例子,它被称为匿名函数(anonymous)。

第3部分是包围在圆括号中的一组参数。多个参数用逗号分隔开。这些参数的名称将被定义为函数中的变量。它们不像普通的变量那样呗初始化为undefined,而是在该函数被调用时初始化为实际提供的参数的值。

第4部分是包围在花括号中的一组语句。这些语句是函数的主体,它们在函数被调用时执行。

  函数字面量可以出现在任何允许表达式出现的地方。函数也可以被定义在其他函数中。一个内部函数处理可以访问自己的参数和变量,同时也能自由访问把它嵌套在其中的父函数1。通过函数字面量创建的函数对象包括一个连接到外部上下文的连接。这被称为闭包(closure)。它是JavaScript强大表现力的来源。

3、调用

  调用一个函数会暂停当前函数的执行,传递控制权和参数给新函数2。除了声明时定义的形参式参数,每个函数还接收两个附件的参数:this和arguments。参数this在面向对象编程中非常重要,它的值取决于调用的模式。在JavaScript中一共有4种调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。这些模式在如何初始化关键字参数this存在差异。

   调用运算符是跟在任何一个函数值的表达式之后的一对圆括号。圆括号内可包含零个或多个逗号隔开的表达式。每个表达式产生一个参数值。每个参数值被赋予函数声明时定义的形参数名。当实际参数(arguments)的个数与形式参数(paramenters)的个数不匹配时,不会导致运行时错误。如果实际数值过多了,超出的参数值会被忽略。如果实际参数值过少,缺失的值会被替换为undefined。对参数值不会进行类型检查;任何类型的值都可以被传递给任何参数。


3.1 方法调用模式

 当 一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。如果调用表达式包含一个提取属性的动作(即包含一个.点表达式或[subscript]下标表达式),那么它就是被当做一个方法来调用。


var myobject={
  value=1,
  increment:function(inc){
      this.value+=typeof inc=== 'number' ? inc : 1;
   }
}
myobject.increment();
方法可以使用this访问自己所属的对象,所以它能从对象中取值或对对象进行修改。this到对象的绑定发生在调用的时候。这个“超级”延迟绑定(very late binding)使得函数可以对this高度复用。通过this可取得它们所属对象的上下文的方法称为公共方法(public method)。



3.2 函数调用模式

  当一个函数并非一个对象的属性时,那么它就被当做一个函数来调用的;


function sum (a,b){
   returen a+b;
} 
sum(3,4);
此模式调用函数时,this被绑定到全局对象。当内部函数被调用时,this仍然是全局对象,而不是外部函数的this变量,如果内部函数调用想获取函数的this,那么久需要把this赋值给一个变量,如that



 myobject.double=function (){
   var that=this;
      var helper= function(inc){
      that.value=sum(that.value,that.value);
   }
  helper();
}
myobject.double();


3.3构造器调用模式


如果在一个函数前面带上new 来调用,那么背地里将会创建一个连接到该函数的prototype成员的新对象,同时this会被绑定到呢个新对象上。


var Quo=function (string){
  this.status =string;
};
Quo.prototype.get_status = function (){
   returen this.status;
}
  var myQuo= new Quo('confused');
 //打印显示 confused
一个函数,如果创建的目的就是希望结合new前缀来调用,那它就被称为构造函数。按照约定,它们保存在以大写格式命名的变量里。如果调用构造函数时没有在前面加new,可能会发生非常糟糕的事情,既没有编译时警告 ,也没有运行时警告,所以大写约定非常重要。



var array =[3,4];
var sum1=sum.applay(null,array); //值为7
var statusObject ={
   status: 'A-OK'
}
//statusObject 并没有继承自Quo.pratotype,但我们可以在statusObject 上调用
//用get_status 方法,尽管statusObject 并没有一个名为get_status的方法。
 var status =Quo.prototype.get_status.applay(statusObject);
//值为A-OK


当函数被调用时,会得到一个“免费”配送参数,那就是arguments数组。函数可以通过此参数访问所有它被调用时传递给它的参数列表,包括那些没有被分配给函数声明时定义的形式参数的多余参数。这使得编程无需指定参数个数的函数称为可能。

4、返回

当一个函数被调用时,它从第一个语句开始执行,并在遇到关闭函数体的}时结束。然后函数把控制权还给调用函数的程序。

 return 语句可用来使函数提前返回。当return被执行时,函数立即返回而不再执行余下的语句。

一个函数总会返回一个值。如果没有指定返回值,则返回undefined。

如果函数 调用时在前面加new 前缀,返回值不是一个对象,则返回this(该新对象)。


1、函数可以访问自身的参数与变量,也可以访问父级的参数和变量以及全局变量(不能访问父级的父级的参数变量