摘要:代碼示例返回參數平方和函數的重載在靜態語言中相同名字的函數,如果其參數個數不同或者參數順序不同都被認為是不同的函數,稱為函數重載。立即執行函數的作用函數立即執行,先括號聲明函數然后括號調用函數。
函數聲明和函數表達式的區別
函數聲明:
function functionName(){ statement; }
函數表達式:
var printName = function(){ console.log("Byron"); };
對于函數聲明,js解析器會優先讀?。ㄅc變量提升類似,整個函數聲明也會預先解析
),確保在所有代碼執行之前聲明已經被解析。而函數表達式,如同定義其它基本類型的變量一樣,定義變量名和賦值分兩個階段,定義變量名被提升,函數賦值過程并沒有一起被提升。具體表現在,當使用函數聲明的形式來定義函數時,可將調用語句寫在函數聲明之前,而函數表達式,調用語句寫函數表達式前面會出錯。當聲明同一名稱的函數和變量時,變量聲明在函數聲明前面,后面的函數聲明會覆蓋前面變量的聲明。如果一個函數的聲明被括號括起來,此時是一個語句,函數聲明不會被提升(前置)由于JavaScript的這一怪異的“特性”,我們在函數內部定義變量時,請嚴格遵守“在函數內部首先申明所有變量”這一規則。最常見的做法是用一個var申明函數內部用到的所有變量
1.變量前置就是把變量的聲明提前到當前作用域的最前面,但變量的賦值仍然按照原來的順序執行,如果變量聲明但未被賦值,變量會自動賦值為undefined。
2.函數的聲明前置有兩種情況,一個是使用函數聲明,則整個聲明都前置,而且會被前置到變量聲明的后面;另一個是使用函數表達式,那么規則和變量的聲明前置一樣。
代碼示例:
console.log(a); //undefined 聲明變量,變量提升 var a,還未執行賦值,所以a為undefined var a = 1; //a=1; 執行變量賦值,a=1; console.log(b); //b is not defined b未聲明
// 以函數聲明方式定義函數,函數聲明提升,調用函數的語句可寫在函數聲明語句前 sayName("world") function sayName(name){ console.log("hello ", name); } sayAge(10); //sayAge is not a function 以函數表達式方式定義函數,類似變量提升,var sayAge為undefined所以調用函數時提示不是函數 var sayAge = function(age){ console.log(age); };
同名變量提升
function fn(){} //先變量提升var fn,再函數提升var fn=function(){},因為同名所以此時函數提升覆蓋變量提升,fn為函數 var fn = 3; //fn=3,此時fn的值為3 console.log(fn); //輸出3函數的arguments
函數中默認的arguments對象是獲取的函數在執行中傳遞進函數的實際參數。arguments只在函數內部起作用,并且永遠指向當前函數的調用者傳入的所有參數。arguments類似Array即類數組對象,但它不是一個Array。即使函數不定義任何參數,arguments還是可以拿到參數的值。arguments常用來檢測傳遞進函數的參數個數。類數組對象轉數組使用Array.prototype.slice.call(arguments)方法。
代碼示例:
返回參數平方和
function sumOfSquares(){ var sum=0; for(var i=0;iJS函數的重載 在靜態語言中相同名字的函數,如果其參數個數不同或者參數順序不同都被認為是不同的函數,稱為函數重載。在JavaScript中沒有函數重載的概念,函數通過名字確定唯一性,參數不同也被認為是相同的函數,后面的覆蓋前面的。JS函數重載用arguments來遍歷傳遞進函數的參數,根據參數的值來執行不同的代碼。
立即執行函數的作用函數立即執行,先括號聲明函數然后括號調用函數。
什么是函數的作用域鏈
(function(){ })( )(函數聲明)(函數調用)或者(function( ){ }( ))
立即執行函數表達式一般不需要給函數命名,因為只需要立刻執行并返回一個結果就行。函數立即執行的作用:
1.不必為函數命名,避免了污染全局變量,立即執行完成后被內存回收。
2.IIFE內部形成了一個多帶帶的作用域(因為加了括號成為了一個語句),可以封裝一些外部無法讀取的私有變量1.在大多數語言中都是用花括號{}來形成一個作用域,俗稱塊作用域,但是在JavaScript中{ }并沒有帶來塊作用域(ES6除外)。ES5中作用域分全局作用域和函數作用域,函數作用域內定義的變量函數外不可以訪問。
2.函數內聲明變量加var代表局部變量,如果函數內聲明變量不加var,則聲明變量是全局變量。全局作用域的變量實際上是被綁定到window的一個屬性。
3.由于JavaScript的函數可以嵌套,此時,內部函數可以訪問外部函數定義的變量,反過來則不行。任何變量(函數也視為變量),如果沒有在當前函數作用域中找到,就會繼續往上查找,最后如果在全局作用域中也沒有找到,則報ReferenceError錯誤。JavaScript的函數在查找變量時從自身函數定義開始,從“內”向“外”查找。如果內部函數定義了與外部函數重名的變量,則內部函數的變量將“屏蔽”外部函數的變量。"use strict"; function foo() { var x = 1; function bar() { var y = x + 1; // bar可以訪問foo的變量x! } var z = y + 1; // ReferenceError! foo不可以訪問bar的變量y! }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107895.html
摘要:所以這里可以利用高階函數的思想來實現一個簡單的緩存,我可以在函數內部用一個對象存儲輸入的參數,如果下次再輸入相同的參數,那就比較一下對象的屬性,把值從這個對象里面取出來。 1. 高階函數 高階函數就是那種輸入參數里面有一個或者多個函數,輸出也是函數的函數,這個在js里面主要是利用閉包實現的,最簡單的就是經常看到的在一個函數內部輸出另一個函數,比如 var test = function...
摘要:項目開發準備描述項目技術選型接口接口文檔測試接口啟動項目開發使用腳手架創建項目開發環境運行生產環境打包運行管理項目創建遠程倉庫創建本地倉庫配置將本地倉庫推送到遠程倉庫在本地創建分支并推送到遠程如果本地有修改新的同事克隆倉庫如果遠程修 day01 1. 項目開發準備 1). 描述項目 2). 技術選型 3). API接口/接口文檔/測試接口 2. 啟動項目開發 1). 使用react...
摘要:執行上下文作用域鏈和內部機制一執行上下文執行上下文是代碼的執行環境,它包括的值變量對象和函數。創建作用域鏈一旦可變對象創建完,引擎就開始初始化作用域鏈。 執行上下文、作用域鏈和JS內部機制(Execution context, Scope chain and JavaScript internals) 一、執行上下文 執行上下文(Execution context EC)是js代碼的執...
摘要:作用域鏈用于表明上下文的執行順序。當前上下文執行完畢則出棧,執行下一個上下文。 從一個簡單的例子出發 先從一個簡單的例子出發(先不涉及異步),看看自己是否大致了解瀏覽器的執行機制: console.log(a); var a=1; function foo(a){ console.log(a); var a=2; console.log(a); } foo(a)...
摘要:深入理解引擎的執行機制靈魂三問為什么是單線程的為什么需要異步單線程又是如何實現異步的呢中的中的說說首先請牢記點是單線程語言的是的執行機制。 深入理解JS引擎的執行機制 1.靈魂三問 : JS為什么是單線程的? 為什么需要異步? 單線程又是如何實現異步的呢? 2.JS中的event loop(1) 3.JS中的event loop(2) 4.說說setTimeout 首先,請牢記2...
摘要:所以覺得把這個執行的詳細過程整理一下,幫助更好的理解。類似的語法報錯的如下圖所示三預編譯階段代碼塊通過語法分析階段之后,語法都正確的下回進入預編譯階段。另開出新文章詳細分析,主要介紹執行階段中的同步任務執行和異步任務執行機制事件循環。 一、概述 js是一種非常靈活的語言,理解js引擎的執行過程對于我們學習js是非常有必要的??戳撕芏噙@方便文章,大多數是講的是事件循環(event loo...
閱讀 1962·2021-11-16 11:45
閱讀 3673·2021-09-06 15:02
閱讀 2021·2019-08-30 15:44
閱讀 2289·2019-08-30 11:21
閱讀 1851·2019-08-29 16:31
閱讀 3425·2019-08-29 13:55
閱讀 1898·2019-08-29 12:15
閱讀 3253·2019-08-28 18:05