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();

相關文章
相關標籤/搜索