javascript筆記(一)

使用function關鍵字來定義函數,分爲兩種形式:css

  • 聲明式函數定義;
     function add(m,n) { alert(m+n); }
    這種方式等同於構造一個Function類的實例的方式:
    var add = new Function("m", "n", "alert(m+n);");
    Function類構造方法的最後一個參數爲函數體:"alert(m+n);",前面的都是函數的形參,參數必須是字符串形式的:"m","n"。
  • 函數表達式;
    複製代碼
     1 //將一個匿名函數賦值給變量add  2 var add = function(m, n) {  3 alert(m + n);  4 };  5 add(1, 2);//3  6  7 //函數表達式做爲參數傳遞給其餘函數  8 var arr = [1, 3, 4, 2];  9 arr = arr.sort(function(a, b) { 10 return a - b; 11 }); 12 alert(arr);//1,2,3,4 13 14 //定義後當即調用 15 alert( function(m, n) { 16 return m + n; 17 }(1, 2)); 18 19 //函數表達式也能夠定義名稱(如用於遞歸) 20 var f=function fact(x){ 21 if(x<1) { 22 return 1; 23 }else{ 24 return x*fact(x-1); 25  } 26 };
    複製代碼

聲明式函數定義和函數表達式的一點區別jquery

聲明式函數定義語句屬於頂級做用域範圍,函數調用語句可寫在函數聲明語句以前:數組

add(1, 2);//3 function add(m, n) { alert(m + n); }

函數表達式定義的函數在定義以前沒法調用:app

//TypeError: add is not a function
add(1, 2); var add = function(m, n) { alert(m + n); };

函數的返回值函數

Javascript中的函數不須要聲明返回類型,使用return關鍵字返回一個值。若函數不包含return語句,或者直接使用"return;",則函數的返回值爲undefined。post

嵌套函數this

函數能夠嵌套在其餘的函數裏面,內層函數能夠訪問外層函數的參數和變量:spa

複製代碼
function add(m, n) { function d(x) { return x * 2; } return d(m) + d(n); } alert(add(1, 2));//6
複製代碼

調用函數debug

函數體代碼在函數被調用時纔會執行。Javascript函數有4中調用方式:code

  • 普通的函數調用
  • 方法調用
  • 構造函數調用
  • 經過 call() 和 apply() 間接調用

普通的函數調用

最經常使用的函數調用方式,如:

alert("hello");

var result = add(1, 2);

方法調用

所謂方法就是將一個函數賦給一個對象的屬性:

複製代碼
 1 //定義一個函數  2 function hello(name) {  3 alert('hello,' + name);  4 };  5 var user = {};  6  7 //賦值給user的sayHi屬性  8 user.sayHi = hello;  9 10 //方法調用 11 user.sayHi('張三');
複製代碼

普通的函數調用和方法調用的一個區別:在"普通的函數調用"方式中,函數的調用上下文(this的值),爲全局對象(非嚴格模式)或者undefined(嚴格模式)。而在"方法調用"方式中,this指向當前對象。利用這一特性,咱們能夠在方法不須要明確的返回值時,直接返回this,從而實現"方法鏈"。如jquery中常見的:

$('#btn_edit').css({color:red}).show();

嵌套函數中的this:嵌套函數中,內層函數不會繼承外層函數的this,即當內層函數做爲方法調用時,內層函數的this指向當前調用對象;當內層函數做爲函數調用時,this的值爲全局對象(非嚴格模式)或者undefined(嚴格模式)。怎樣在內層函數中訪問外層函數的this呢?一般將this保存在一個局部變量中,經過變量來訪問:

複製代碼
 1 var obj = {  2 f : function() {  3 var self = this;  4 console.log(this === obj);//true,this指向當前對象  5  6  f1();  7  8 function f1() {  9 console.log(this === obj);//false,this爲全局對象或者unde 10 console.log(self === obj);//true,self指向外層this,即當前對象 11  } 12  } 13 };
複製代碼

構造函數調用

當使用new關鍵字建立一個對象時,即調用了構造函數。構造函數若沒有形參,能夠省略圓括號:

var obj = new Object(); //等價於 var obj = new Object;

調用構造函數,建立了一個新對象,這個新對象會成爲該構造函數的調用上下文(this的值):

function User(name) { this.name=name; console.debug(this); } var user = new User('張三');

call() 和 apply() 間接調用

Javascript中函數也是對象,也擁有方法。其中 call() 和 apply() 能夠用來間接調用函數。call() 的第一個參數用來指定調用上下文(即this的值),後面的參數是傳入調用函數的實參。

複製代碼
 1 var name = 'A';  2 var user = {  3 name : 'B'  4 };  5  6 function showName() {  7 alert(this.name);  8 }  9 10 showName();//A,this爲全局對象 11 showName.call(user);//B,this爲user對象
複製代碼

apply() 和 call() 相似,區別在於,後面的實參須要以數組的形式傳遞(可將當前函數的arguments數組直接傳入)。

相關文章
相關標籤/搜索