RxJs學(xué)習(xí)筆記1--js基礎(chǔ)知識--函數(shù)

函數(shù)的聲明與定義

方式1:

function print(s) {
  console.log(s);
}

方式2:

var print = function(s) {
  console.log(s);
};
 //方式2定義函數(shù),如果使用了函數(shù)名,如下面代碼的x,函數(shù)名在函數(shù)體外邊無效。
var print = function x(){
  console.log(typeof x);
};
X;// ReferenceError: x is not defined

方式3:不推薦使用

var foo = new Function(
  'return "hello world"'
);

函數(shù)的調(diào)用

函數(shù)名加()表示還是調(diào)用,() 中間

function add(x, y) {
  return x + y;
}

add(1, 1) 

第一等公民

JavaScript 語言將函數(shù)看作一種值,與其它值(數(shù)值、字符串、布爾值等等)地位相同。凡是可以使用值的地方,就能使用函數(shù)。比如,可以把函數(shù)賦值給變量和對象的屬性,也可以當(dāng)作參數(shù)傳入其他函數(shù),或者作為函數(shù)的結(jié)果返回。函數(shù)只是一個可以執(zhí)行的值,此外并無特殊之處。

函數(shù)名提升

JavaScript 引擎將函數(shù)名視同變量名,所以采用function命令聲明函數(shù)時,整個函數(shù)會像變量聲明一樣,被提升到代碼頭部。所以,下面的代碼不會報錯。

f();

function f() { ... }

獲取函數(shù)信息

  1. name屬性獲取函數(shù)的名字
function f1() {}
f1.name 
// -----
var f2 = function () {};
f2.name 
  1. length屬性獲取 函數(shù)定義之中的參數(shù)個數(shù)。
    length屬性提供了一種機(jī)制,判斷定義時和調(diào)用時參數(shù)的差異,以便實現(xiàn)面向?qū)ο缶幊痰摹狈椒ㄖ剌d“(overload)。
function f(a, b) {}
f.length // 2
  1. toString方法返回一個字符串,內(nèi)容是函數(shù)的源碼。帶// 注釋
function f() {
  a();
  b();
  c();
}

f.toString()
// function f() {
//  a();
//  b();
//  c();
// }

作用域

作用域(scope)指的是變量存在的范圍。在 ES5 的規(guī)范中,Javascript 只有兩種作用域:一種是全局作用域,變量在整個程序中一直存在,所有地方都可以讀??;另一種是函數(shù)作用域,變量只在函數(shù)內(nèi)部存在。ES6 又新增了塊級作用域。

  1. 在函數(shù)內(nèi)部定義的變量,外部無法讀取,稱為“局部變量”(local variable)。
  2. 函數(shù)外部聲明的變量就是全局變量(global variable),它可以在函數(shù)內(nèi)部讀取。
  3. 函數(shù)本身也是一個值,也有自己的作用域。它的作用域與變量一樣,由其聲明所在的位置決定。

同名參數(shù)

同名參數(shù),最后面的覆蓋前面的,前面的無效。

function f(a, a) {
  console.log(a);
}

f(1, 2) // 2

arguments 對象

由于 JavaScript 允許函數(shù)有不定數(shù)目的參數(shù),在內(nèi)部是由 arguments對象機(jī)制實現(xiàn)的。
arguments對象包含了函數(shù)運(yùn)行時的所有參數(shù),arguments[0]就是第一個參數(shù),arguments[1]就是第二個參數(shù),以此類推。這個對象只有在函數(shù)體內(nèi)部,才可以使用。

var f = function (one) {
  console.log(arguments[0]);
  console.log(arguments[1]);
  console.log(arguments[2]);
}

f(1, 2, 3)
//輸出1,2,3

js閉包

由于在 JavaScript 語言中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取內(nèi)部變量,因此可以把閉包簡單理解成“定義在一個函數(shù)內(nèi)部的函數(shù)”。

function f1() {
  var n = 999;
  function f2() {
    console.log(n);
  }
  return f2;
}

var result = f1();
result(); 

上面代碼中,函數(shù)f1的返回值就是函數(shù)f2,由于f2可以讀取f1的內(nèi)部變量,所以就可以在外部獲得f1的內(nèi)部變量了。
閉包就是函數(shù)f2,即定義在某函數(shù)內(nèi)部,讀取該函數(shù)內(nèi)部變量的函數(shù)。

立即執(zhí)行函數(shù)

// 寫法一
var tmp = newData;
processData(tmp);
storeData(tmp);

// 寫法二
(function () {
  var tmp = newData;
  processData(tmp);
  storeData(tmp);
}());

有時,我們需要在定義函數(shù)之后,立即調(diào)用該函數(shù)。這時,你不能在函數(shù)的定義之后加上圓括號,這會產(chǎn)生語法錯誤。
產(chǎn)生這個錯誤的原因是,JavaScript 引擎規(guī)定,如果function關(guān)鍵字出現(xiàn)在行首,一律解釋成語句。因此,行首是function關(guān)鍵字,引擎認(rèn)為這是函數(shù)的定義語句,不應(yīng)該以圓括號結(jié)尾,所以就報錯了。解決方法就是不要讓function出現(xiàn)在行首,按表達(dá)式處理函數(shù)定義。最簡單的方法,就是將其放在一個圓括號里面。

(function(){ /* code */ })();

eval命令

eval命令接受一個字符串作為參數(shù),并將這個字符串當(dāng)作語句執(zhí)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容