JavaScript 中的函数

函数的定义和调用

function functionName(arg0,arg1,…)
{  statements
    return a;
}前端

函数:function stripPx(orgStr)python

 {      if(orgStr=="") return 0;数组

     return parseFloat(orgStr.substring(0,value.length-2));函数

}spa

调用:var mapX=stripPx(“100px”);   //将100px转化为100,利用方法的返回值给变量赋值,(几乎全部语言均可以这样。)指针

理解参数

参数也是弱类型,无需指定变量类型对象

参数arguments是用数组来表示的, 所以不介意传递的参数个数和类型ip

function sayHi() {内存

     alert("Hello " + arguments[0] + ", " + arguments[1]);作用域

        }

sayHi(“Tom", "how are you today?");

 

function howManyArgs() {

            alert(arguments.length); }

        howManyArgs("string", 45);    //2

        howManyArgs();                //0

        howManyArgs(12);              //1

JavaScript函数无重载,即不容许同名函数,但但是模拟实现重载//好比jQuery中以前的toggle()函数以及一些其余的函数大概就是模拟实现的重载。

JavaScript函数模拟重载例子:

function Add(firstnumber,sencondnumber) {

if (arguments.length == 0)//没有传递参数

{     return null; }

else if (arguments.length == 1) {//传递的是一个参数

return firstnumber;}

else if (arguments.length == 2) //传递的是两个参数

{ return arguments[0]+arguments[1]; }

//经过函数内写if-else的方法实现函数模拟重载。

变量类型

ECMAScript变量包含两种数据类型的值:

基本数据类型值:简单数据段,如Number类型值;

引用类型值:可能由多个值构成的对象。

基本数据类型是按值访问的,能够操做保存在变量中的实际值。

引用类型的值是按引用(别名)访问的,实际是在对引用指向的对象进行操做。

//能够为引用类型的值添加属性和方法,也能够改变和删除属性和方法。

//不能为基本类型的值添加属性和方法

var person=new Object();

Person.name=“Tom”;

alert(person.name)  //”Tom”

var name=“Tom”;

name.age =27;

alert(name.age);  //undefined 

//注意 undefined意思是存在。而未定义,不能经过“=”为其添加属性。

复制变量值

一个变量向另外一个变量复制基本类型值,会在变量对象上建立一个新值,而后把该值复制到为新变量分配的位置上。

var num1=5;

var num2=num1

//num1=5,num2=5;二者在赋值结束后再也不具备相关性。

复制引用类型的值时,复制的副本是一个指针,指向存储在堆中的一个对象。

复制后,两个变量引用同一个对象,改变其中一个变量,就会影响另外一个变量。

var obj1=new Object();

var obj2=obj1;

obj1.name=“Tom”;

alert(obj2.name);    //”Tom”

//这是由语言的特色决定的,几乎全部的语言都是如此,固然也能够本身写符合本身要求的语言,实际上如今存在的的不少语言都是一些真正的大佬本身按本身的喜爱定制的,好比python。

函数传递参数

函数的参数都是按值传递的:把函数外部的值复制给函数内部的参数,至关于把值(实参)从一个变量复制到另外一个变量(形参)。

参数传递基本类型值时,被传递的值会被复制给一个局部变量。

传递引用类型值时,把值在内存中的地址复制给一个局部变量,局部变量的变化会反映在函数的外部。

ep1.

function addTen(num){

           num+=10;

           return num;

}

var count=20;

var result=addTen(count);

alert(count);   //20,没有变化

alert(result);   //30

ep2.

function setName(obj){//将类做为函数参数
obj.name=“Tom”;

}

var person=new Object();

var pp = person

setName(pp);

alert(pp.name);    //”Tom”

ep3.

function setName(obj){
obj.name=“Tom”;

obj=new Object();

obj.name=“Jerry”;

}

var person=new Object();

setName(person);

alert(person.name);//”Tom”

//这个很是容易混淆,函数中改变了obj的指向,使其指向一个叫jerry的对象了。

注意,这时的obj只是函数的形参身份,并不表明此时的person指向的对象了。

变量的做用域

执行环境定义了变量或函数有权访问的其余数据。

每一个函数都有本身的执行环境。全局执行环境是最外围的一个执行环境。

做用域链:用途是保证对执行环境有权访问的全部变量和函数的有序访问。

标识符解析:沿着做用域链一级一级地搜索变量的过程。搜索过程始终从做用域链的前端开始,而后逐级地向后搜索,直到找到变量为止

var color = “blue”;

function changeColor(){

       if(color == “blue”){

           color = “red”; 

       } else {

           color = “blue”;    

       }

}

changeColor();

alert(“Color is now ”)+color;

//Color is now red

函数的执行过程:

1)首先在函数changeColor()做用域链的前端查找本身的变量对象,判断有没有color对象。

2)自身变量对象中不存在color对象,沿着做用域链向后查找,查找全局环境变量。

3)在全局环境变量中找到了color变量,得到color变量值“blue”,color变量解析结束。

var color = “blue”;

function changeColor(){

      var anotherColor = “red”;

      function swapColors(){

          var tempColor=anotherColor;

          anotherColor=color;

          color=tempColor;

//能够访问color、anotherColor和tempColor

      }

//能够访问color、anotherColor不能访问tempColor

     swapColors();

}

//只能访问color

changeColor();

相关文章
相关标签/搜索