js函數的聲明
函數是一段可以反復調用的代碼塊。
JavaScript聲明一個函數可用兩種方法。
第一種方法使用function命令。function命令后面是函數名,函數名后面是一對圓括號,里面是傳入函數的參數。函數體放在大括號里面,大括號后面不用加分號。
function print(s)
{
console.log(s);
}
上面的代碼命名了一個print函數,以后使用print()這種形式,就可以調用相應的代碼。
第二種采用變量賦值的寫法。
var print = function(s) {
console.log(s);
};
這種寫法將一個匿名函數賦值給變量。匿名函數又稱函數表達式,因為賦值語句的等號右側只能放表達式。采用函數表達式聲明函數時,function命令后面不帶有函數名,需要在語句的結尾加上分號,表示語句結束。
js函數的調用
調用函數時,要使用圓括號運算符。圓括號之中,可以加入函數的參數。
函數體內部的return語句,表示返回,直接返回后面的表達式的值,即使return語句后還有其他語句,也不會得到執行。
return語句不是必需的,如果沒有的話,該函數就不返回任何值,或者說返回undefined。
可以把函數賦值給變量和對象的屬性,也可以當作參數傳入其他函數,或者作為函數的結果返回。
根據ECMAScript的規范,不得在非函數的代碼塊中聲明函數,最常見的情況就是if和try語句。
函數的name屬性返回緊跟在function關鍵字之后的那個函數名。length屬性返回函數預期傳入的參數個數,即函數定義之中的參數個數。函數的toString方法返回函數的源碼。
js函數作用域
作用域是指變量存在的范圍。
Javascript只有兩種作用域:
一種是全局作用域,變量在整個程序中一直存在,所有地方都可以讀取;
另一種是函數作用域,變量只在函數內部存在。
在函數外部聲明的變量稱為全局變量,它可以在函數內部讀取。在函數內部定義的變量,外部無法讀取,稱為局部變量。函數內部定義的變量,會在該作用域內覆蓋同名全局變量。
注意,對於var命令來說,局部變量只能在函數內部聲明,在其他區塊中聲明,一律都是全局變量。
if (true)
{
var x = 5;
}
console.log(x); // 5
上面代碼中,雖然變量x在條件判斷區塊之中聲明,但仍然是一個全局變量,可以在區塊之外讀取。
函數作用域內部用var命令聲明的變量,不管在什么位置,變量聲明都會被提升到函數體的頭部。
函數執行時所在的作用域,是定義時的作用域,而不是調用時所在的作用域。
'use strict';
var a=100;
function m( )
{
return a;
}
function n( )
{
var a='abc';
return m( );
}
console.log('a='+m( ));//a=100
console.log('a='+n( ));//a=100
函數體內部聲明的函數,作用域綁定函數體內部。如下代碼中,函數A內部聲明了一個函數f,f的作用域綁定A。當在A外部取出f執行時,變量a指向的是A內部的a,而不是A外部的a。
'use strict';
var a="外部變量";
function A( )
{
var a="內部變量";
function f()
{
return "a="+a;
}
return f;
}
var foo=A( );
console.log( foo( ) ); //a=內部變量
js函數的參數
函數運行時提供的外部數據叫參數,Javascript允許省略參數。
如果函數參數是數值、字符串、布爾值,那么傳遞方式是傳值傳遞,在函數體內修改參數值,不會影響到函數外部。
如果函數參數是數組、對象、其他函數),那么傳遞方式是傳址傳遞,在函數內部修改參數,將會影響到原始值。
函數內部的arguments對象包含了函數運行時的所有參數,arguments[0]就是第一個參數,arguments[1]就是第二個參數,以此類推。arguments對象的length屬性可以判斷函數調用時到底帶幾個參數。嚴格模式下,arguments對象是一個只讀對象,修改它是無效的,但不會報錯。
'use strict';
var f = function(one)
{
console.log(f.length);//1
console.log(arguments.length);//2
console.log(arguments[0]);//1
console.log(arguments[1]);//2
console.log(arguments[2]);//undefined
}
f(1, 2);