摘要:在中,函數也是以對象的形式存在的。也可以使用對象作為參數返回值調用該函數的返回結果。調用自身的函數被稱之為遞歸函數。默認名字的函數被稱之為匿名函數。內部函數在函數中聲明內嵌函數,內嵌函數對函數中的局部變量進行訪問。
Function類型 Function與函數
函數它只定義一次,但可能被執行或調用多次 。
Function類型是JavaScript提供的引用類型之一,通過Function類型創建Function對象。
在JavaScript中,函數也是以對象的形式存在的。每個函數都是一個Function對象。函數名,本質就是一個變量名,是指向某個Function對象的引用。
// 1.函數聲明方式 function fun(){ console.log("this is function"); } // 2.字面量方式 var fn = function(){ console.log("this is function too"); } // 判斷函數是否為Function類型的 console.log(fun instanceof Function);// true console.log(fn instanceof Function);// true // JavaScript中所有的函數都是Function類型的對象 /* 3.創建Function類型的對象 -> 是一個函數 var 函數名 = new Function(參數,函數體); * 由于函數的參數和函數體都是以字符串形式傳遞給Function的 */ var f = new Function("a","console.log(a)"); f(100);// 以函數方式進行調用Function類型 構造函數
在JavaScript中,函數除了可以通過函數定義語句或字面量表達式兩種方式定義之外,還可以通過Function類型進行定義。(注意:通過Function類型定義函數的效率遠不如通過函數定義語句或字面量表達式兩種方式定義。目前,定義函數具有三種方式,這三種方式之間存在一定的差別。)
// 1.Object與Function都是自身的類型 console.log(Object instanceof Object);// true console.log(Function instanceof Function);// true // 2.Object自身是構造函數,而構造函數也是函數,是函數都是Function類型 console.log(Object instanceof Function);// true // 3.Function是引用類型,用于創建對象,是對象都是Object類型 console.log(Function instanceof Object);// true
// 變量的聲明提前 console.log(v);// undefined var v = 100; // 如果使用函數聲明方式定義函數時 -> 函數的聲明提前 fun(); function fun(){ console.log("this is function"); }apply()方法
Function的apply()方法用于調用一個函數,并且接受指定的this值,以及一個數組作為參數。
語法結構:
1.thisArg參數:可選項,在func函數運行時使用this值。
2.argsArray參數:可選項,一個數組或者類數組對象,其中你那個的數組元素將作為多帶帶的參數傳給func函數。也可以使用argments對象作為參數
3.返回值:調用該函數的返回結果。
// 定義函數 function fun(value){ console.log("this is " + value); } // 函數的調用方式 fun("function");// 語法結構:函數名稱() apply(thisArg,argArray)方法 -> 用于調用一個指定函數 參數 thisArg - this argArray - 數組,作為參數(實參)的列表 fun.apply(null, ["function"]);call()方法
Function的call()方法用于調用一個函數,并且接收指定的this值作為參數,以及參數列表。
語法結構:
1.thisArg參數:在func函數運行時使用的this值。
2.arg1,arg2,...參數:指定的參數列表。
3.返回值:調用該函數的返回結果。
apply()與call()非常相似,不同之處在于提供參數的方式。
Function的bind()方法用于創建一個新的函數(稱之為綁定函數),并且接收指定的this值作為參數,以及參數列表。
// 定義函數 function fun(value){ console.log("this is " + value); } /* bind(thisArg, arg1, arg2, ...)方法 * 作用 - 用于創建一個新函數(稱為綁定函數) * 參數 * thisArg - this arg1, arg2, ... - 表示參數列表 * 返回值 - 返回新的函數 */ // var f = fun.bind();// 相對于從指定函數復制一份出來 // console.log(f); // f(); fun("周芷若");// this is 周芷若 var f = fun.bind(null, "張無忌"); f();// this is 張無忌沒有重載
在其他開發語言中,函數具有一種特性,叫做重載。所謂的重載,就是定義多個同名的函數,但每一個函數接收的參數的個數不同,程序會根據調用是傳遞的實參個數進行判斷,具體調用的是哪個函數。
// 定義函數 function fun(value){ console.log("this is " + value); } bind(thisArg, arg1, arg2, ...)方法 作用 - 用于創建一個新函數(稱為綁定函數) 參數 thisArg - this arg1, arg2, ... - 表示參數列表 返回值 - 返回新的函數 var f = fun.bind();// 相對于從指定函數復制一份出來 console.log(f); f(); fun("周芷若");// this is 周芷若 var f = fun.bind(null, "張無忌"); f();// this is 張無忌
但在JavaScript中函數時沒有重載現象的。也就是說,如果同時定義多個同名函數,只有最后一個定義的函數時有效的。
不過,JavaScript提供的arguments對象,該對象可以模擬函數重載的現象。arguments對象是函數內部的本地變量;arguments已經不再是函數的屬性了。
arguments對象可以獲取函數的所有參數,但arguments對象并不是一個數組,而是一個類數組對象(沒有數組特有的方法)。
在一個函數體內,如果想調用自身函數的話,有兩種方式;
1.通過使用自身函數實現
2.通過使用arguments對象的callee屬性實現。
調用自身的函數被稱之為遞歸函數。在某種意義上,遞歸近似于循環。兩者都重復執行相同的代碼,并且兩者都需要一個終止條件以避免無限循環或者無限遞歸。
/* 函數的遞歸 -> 就是在指定函數的函數體中調用自身函數 function fun(){ // 當前函數的邏輯內容 console.log("this is function"); // 調用自身函數 -> 實現遞歸 fun(); } fun(); */ function fn(v){ console.log(v); if (v >= 10) { return; } // fn(v + 1); arguments.callee(v + 1); } fn(0);//導致出錯 var f = fn; fn = null; f(0); // console.log(f);特殊函數 匿名函數
JavaScript可以將函數作為數據使用。作為函數本體,他就像普通的數據一樣,不一定要有名字。默認名字的函數被稱之為匿名函數。
匿名函數的兩種用法:
1.可以將匿名函數作為從參數傳遞給其他函數。這樣,接收函數就能利用所傳遞的函數來完成某些事請。
2.可以定義某個匿名函數來執行某些一次性任務。
JavaScript語法中,定義函數必須定義函數名稱 -> 匿名函數 function (){ console.log("this is function"); } 匿名函數的作用: 1.將匿名函數作為參數傳遞給其他函數 -> 回調函數 2.將匿名函數用于執行一次性任務 -> 自調函數回調函數
當一個函數作為參數傳遞給另一個函數時,作為參數的函數被稱之為回調函數。
// 作為另一個函數(fn)的參數的函數(one) -> 回調函數 var one = function(){ return 1; } function fn(v){ return v(); } // one函數僅是作為fn函數的參數出現 -> 并不是調用 // var result = fn(one); /* 以上代碼等價于以下代碼 以下代碼中作為參數的函數 -> 匿名回調函數 */ var result = fn(function(){return 1;}); console.log(result);// 1自調函數
所謂自調函數就是在定義函數后自行調用。
1.第一對括號的作用,放置的是一個匿名函數。匿名函數接受一個參數
2.第二個對括號的作用,是‘立即調用’。在調用時,向匿名函數傳遞參數內內容。
自調函數只需將匿名函數的定義放進一對括號中,然后外面在跟一個對括號。
自調函數 - 定義即調用的函數 第一個小括號 - 用于定義函數 第二個小括號 - 用于調用函數 // 全局作用域 - 生命周期:JavaScript文件從執行到執行完畢 (function(value){ // 函數作用域 - 生命周期:從函數調用到調用完畢 console.log("this is " + value); })("function"); // 表達式語法 (function(value){ // 函數作用域 - 生命周期:從函數調用到調用完畢 console.log("this is " + value); }("function")); !function(value){ // 函數作用域 - 生命周期:從函數調用到調用完畢 console.log("this is " + value); }("function"); +function(value){ // 函數作用域 - 生命周期:從函數調用到調用完畢 console.log("this is " + value); }("function");作為值的函數
將一個函數作為另一個函數的結果進行返回,作為結果返回的函數稱之為作為置的函數。
var one = function(){ return 100; } // 作為值的函數 -> 內部函數的一種特殊用法 function fun(){ var v = 100; // 內部函數 return function(){ return v; }; } var result = fun(); // console.log(result);// one函數 // console.log(result());// 100 console.log(fun()());閉包 作用域鏈
很多開發語言中都具有塊級作用域,但ECMAScript5版本中并沒有跨級作用域,這經常會導致理解上的困惑。
雖然ECMAScript5版本沒有塊級作用域,但具有函數作用域。在某個函數內部定義的變量的作用域就是該函數作用域。
每一段JavaScript代碼(全局代碼或函數)都有一個與之關聯的作用域。這個作用域鏈是一個對象列表或鏈表,這組最想定義了這段代碼“作用域中”的變量。
var a = 10;// 全局變量 function fun(){ var b = 100;// fun函數作用域的局部變量 // 內部函數 function fn(){ var c = 200;// fn函數作用域的局部變量 // 內部函數 function f(){ var d = 300;// f函數作用域的布局變量 // 調用變量 console.log(a);// 10 console.log(b);// 100 console.log(c);// 200 console.log(d);// 300 } f(); // 調用變量 // console.log(a);// 10 // console.log(b);// 100 // console.log(c);// 200 // console.log(d);// d is not defined } fn(); // 調用變量 // console.log(a);// 10 // console.log(b);// 100 // console.log(c);// c is not defined // console.log(d);// d is not defined } fun();閉包是什么
JavaScript允許函數嵌套,并且內部函數可以訪問定義在外部函數中的所有變量和函數,以及外部函數能訪問的所有變量和函數。但是,外部函數卻不能訪問定義在內部函數中的變量和函數。
當內部函數以某種方式唄任何一個外部函數作用域訪問時,一個閉包就產生了。
閉包就是詞法表示包括不必計算的變量的函數,也就是說,該函數能使用函數外定義的變量。
var n;// 定義變量,但不初始化值 function fun(){// 函數作用域 var v = 100; // 進行初始化值 -> 一個函數 n = function(){ console.log(v); } // n(); } fun(); n();// 100
閉包的特點和作用
特點:
1.局部變量:在函數中定義有共享意義的局部變量。
2.內部函數:在函數(f)中聲明內嵌函數,內嵌函數(g)對函數(f)中的局部變量進行訪問。
3.外部使用:函數(f)向外返回此內嵌函數(g),外部可以通過此內嵌函數持有并訪問聲明在函數(f)中的局部變量,而此變量在外部是通過其他途徑無法訪問的。
作用
1.提供可共享的局部變量。
2.保護共享的局部變量。提供專門的讀寫變量的函數。
3.避免全局污染。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/108228.html
摘要:在中,并沒有對抽象類和接口的支持。例如,當對象需要對象的能力時,可以有選擇地把對象的構造器的原型指向對象,從而達到繼承的效果。本節內容為設計模式與開發實踐第一章筆記。 動態類型語言 編程語言按數據類型大體可以分為兩類:靜態類型語言與動態類型語言。 靜態類型語言在編譯時已確定變量類型,動態類型語言的變量類型要到程序運行時,待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...
摘要:雖然,也是面向疾苦的語言,但是,它和靜態類型語言的面向接口編程不一而足。對象對他自己的行為負責,其他對象不關心它的內部實現。 ‘工欲善其事,必先利其器’,在深入學習JavaScript之前,我認為我們很有必要了解以下,JavaScript這門面向對象的動態語言到底是一門什么樣的語言。 JavaScript vs 其他面向對象語言 它沒有使用像Java等傳統的面向對象語言的類式繼承,而...
摘要:前言面向對象編程是將需求抽象成一個對象,針對對象分析其特征屬性和動作方法。面向對象編程思想其中一個特點就是封裝,就是把需要的功能放在一個對象里。將閉包作為創建對象的構造函數。 前言 面向對象編程是將需求抽象成一個對象,針對對象分析其特征(屬性)和動作(方法)。這個對象我們稱之為類。面向對象編程思想其中一個特點就是封裝,就是把需要的功能放在一個對象里。但是JavaScript這種解釋性的...
摘要:設計模式是以面向對象編程為基礎的,的面向對象編程和傳統的的面向對象編程有些差別,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續了解設計模式必須要先搞懂面向對象編程,否則只會讓你自己更痛苦。 JavaScript 中的構造函數 學習總結。知識只有分享才有存在的意義。 是時候替換你的 for 循環大法了~ 《小分享》JavaScript中數組的那些迭代方法~ ...
摘要:對象在中,除了數字字符串布爾值這幾個簡單類型外,其他的都是對象。那么在函數對象中,這兩個屬性的有什么區別呢表示該函數對象的原型表示使用來執行該函數時這種函數一般成為構造函數,后面會講解,新創建的對象的原型。這時的函數通常稱為構造函數。。 本文原發于我的個人博客,經多次修改后發到sf上。本文仍在不斷修改中,最新版請訪問個人博客。 最近工作一直在用nodejs做開發,有了nodejs,...
摘要:這樣每個實例獨享自己的屬性,并和其他同類型的實例共享方法構造函數原型以上這種方式定義的類型,可以通過來判斷一個實例是否是類型的實際上是通過實例的原型鏈來判斷一個對象是否某個類型的實例的,具體的細節后面會詳細介紹。 JavaScript面向對象編程 如何定義自定義類型 首先需要明確,JavaScript并不是傳統意義上的OO語言,它并沒有class的概念, 而是包含了另一套異常強大的...
閱讀 1714·2021-11-25 09:43
閱讀 2673·2019-08-30 15:53
閱讀 1826·2019-08-30 15:52
閱讀 2909·2019-08-29 13:56
閱讀 3330·2019-08-26 12:12
閱讀 570·2019-08-23 17:58
閱讀 2140·2019-08-23 16:59
閱讀 942·2019-08-23 16:21