摘要:今天又把函數部分復習了一下,把一些難點歸納下,為了讓書越看越薄,還是決定記下來。不過,匿名函數的執行環境具有全局性,因此其對象通常指向當然,在通過或改變函數執行環境的情況下,就會指向其他對象。匿名函數可以用來模仿塊級作用域并避免這個問題。
今天又把javascript函數部分復習了一下,把一些難點歸納下,為了讓書越看越薄,還是決定記下來。
1. 創建函數的2種方式:函數聲明和函數表達式:
二者的區別:函數聲明提升。函數聲明后面不能跟圓括號,但函數表達式后面可以跟圓括號。要將函數聲明轉化為函數表達式,只需在給函數聲明加一對圓括號即可。(function(){})();
函數聲明:重要特征:函數聲明提升,在執行代碼前先讀取函數聲明,所以可以把函數聲明放在調用它的語句后面。
sayHi(); function sayHi(){ alert("hi"); } //不會報錯
函數表達式在使用前必須先賦值。否則會報錯。
sayHi(); Var sayHi=function{ alert("hi"); } //會報錯
2.遞歸:arguments.callee是一個指向正在執行的函數的指針。
function factorial(num){ if(num<=1){ return 1; }else{ return num * arguments.callee(num-1); } }
但是在嚴格模式下,不能通過腳本訪問arguments.callee。可通過下面的方法。
var factorial=(function f(num){ if(num<=1){ return 1; }else{ return num * f(num-1); } });
3.this對象:
this對象是在運行時基于函數的執行環境綁定的:在全局函數中this等于window,而在函數被當作某個對象的方法調用時,this等于那個對象。不過,匿名函數的執行環境具有全局性,因此其this對象通常指向window(當然,在通過call()或apply()改變函數執行環境的情況下,this就會指向其他對象)。
var name="the window"; var obj={ name:"My object", getNameFun:function(){ return function(){ return this.name; } } } alert(obj.getNameFun()()); //the window
4.多次聲明同一個變量:
function outputNumber(){ for(var i=0;i<10;i++){ console.log(i); //1 2 3 4 5 6 7 8 9 } var i; console.log(i); //10 }
javascript從來不會告訴你是否多次聲明了同一個變量:遇到上述情況,它只會對后續聲明視而不見(不過,它會執行后續聲明中的變量初始化)。匿名函數可以用來模仿塊級作用域并避免這個問題。
5.閉包與變量:
由于作用域鏈的機制,閉包只能取得包含函數中任何變量的最后一個值。是因為閉包所保存的是整個變量對象,而不是某個特殊的變量。
function createFunction(){ var result=new Array(); for(var i=0;i<10;i++){ result[i]=function(){ return i; } } alert(result[2]()); //10 return result; }
result是一個函數數組,此時每個函數都引用著保存變量i的同一個變量對象,所以在每個函數內部i的值都是10. 但是可以通過讓函數立即執行,來符合我們的預期。
function createFunction(){ var result=new Array(); for(var i=0;i<10;i++){ result[i]=function(num){ return num; }(i) } alert(result);//0,1,2,3,4,5,6,7,8,9 return result; }
由于函數參數是按值傳遞的,所以會將變量i的當前值復制給參數num,這樣,result數組中的每個函數都有自己num變量的一個副本,因此就可以返回各自不同的數值了。
6.返回一個函數:
function createCompareFunction(pro){ return function(obj1,obj2){ var va1=obj1[pro]; var va2=obj2[pro]; if(va1va2){ return 1; }else{ return 0; } }; } var compare=createCompareFunction("name");//創建函數 alert(compare({name:"wsz"},{name:"hh"}));//調用函數
7.一道面試題:
var add=function(x){ var sum=1; var tmp=function(x){ sum=sum+x; return tmp; } tmp.toString=function(){ return sum; } return tmp; } alert(add(1)(2)(3));
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86363.html
摘要:自我學習目前有成千上萬的年輕人在學習和開發,希望獲得一份工作。知道的綁定規則。知道和原型屬性是什么以及它們的作用。高階函數了解函數是中的一級對象,這意味著什么知道從另一個函數返回函數是完全合法的。了解閉包和高階函數允許我們使用的情況。 翻譯原文出處:10 JavaScript concepts you need to know for interviews 之前不是鬧得沸沸揚揚的大漠窮...
摘要:忍者級別的函數操作對于什么是匿名函數,這里就不做過多介紹了。我們需要知道的是,對于而言,匿名函數是一個很重要且具有邏輯性的特性。通常,匿名函數的使用情況是創建一個供以后使用的函數。 JS 中的遞歸 遞歸, 遞歸基礎, 斐波那契數列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執行機制 本文的目的就是要保證你徹底弄懂javascript的執行機制,如果...
摘要:但是變量只有其聲明被提前在作用域的最開始處,賦值結果仍然還在原來位置。 這篇博文是之前在CSDN寫的,現在移至sf。 有過C或者Java類編程經驗的同學,對于先聲明后使用的規則很熟悉,如果使用未聲明的變量或者函數,編譯時程序會報錯!但是,JavaScript卻是一個‘大奇葩’,可以在變量或者函數聲明之前使用,現在根據我的理解在做一下說明。 首先說明JS的hoist分為變量hoist和函...
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。異步編程入門的全稱是前端經典面試題從輸入到頁面加載發生了什么這是一篇開發的科普類文章,涉及到優化等多個方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結思考,循序漸進的理解 TypeScript。 網絡基礎知識之 HTTP 協議 詳細介紹 HTT...
閱讀 3138·2021-11-24 10:24
閱讀 2930·2021-11-11 16:54
閱讀 3067·2021-09-22 15:55
閱讀 2027·2019-08-30 15:44
閱讀 1901·2019-08-29 18:41
閱讀 2761·2019-08-29 13:43
閱讀 3053·2019-08-29 12:51
閱讀 1172·2019-08-26 12:19