摘要:,在這里的將所有的函數聲明進行了提升,從而由替代了函數表達式的在順著條件判斷進行了定義,執行為的情況,進行賦值解析。
函數聲明(funDeclaration)
無論在哪兒定義函數,只要是外層函數并且滿足不被包裹,就都可以進行全局范圍的調用
function foo() { }
在函數體內部的函數聲明無法提升到全局,只能提升到函數體內頂部(塊級作用域空間)
function test() { console.log(1); function test2() { console.log(2); } } test(); // 1 test2(); // Uncaught ReferenceError: test2 is not defined
函數體內部執行:
function test() { test2(); function test2() { console.log(2); } } test(); // 2
在外部要想訪問函數內部申明的函數,需要先return出來:
function test() { console.log(1); function test2() { console.log(2); } return { test2:test2 } } test().test2(); // 2函數表達式(funExpression)
函數表達式需要等到表達式賦值 完成 才可以
換言之使用var來聲明函數,就會涉及到變量的聲明提升,先拿出變量名定義為undefined,再隨著邏輯順序進行賦值先定義,后使用
var foo = function () { }demo1
Toast() // hello world showToast(); // shwoToast is not a function var showToast = function () { console.log("123") } function Toast() { console.log("hello world") }
在這里只需要把showToast 提前就好了demo2 主流瀏覽器解析,ie11+
var sayHello; console.log(typeof (sayHey));//=>undefined console.log(typeof (sayHo));//=>undefined if (true) { function sayHey() { console.log("sayHey"); } sayHello = function sayHo() { console.log("sayHello"); } } else { function sayHey() { console.log("sayHey2"); } sayHello = function sayHo() { console.log("sayHello2"); } } sayHey();// => sayHey sayHello();// => sayHello
在花括號里面聲明的函數在進行預解析時只會提升函數名,不會提升函數體,所以不管if條件是否為真,函數體都不會提升,永遠是undefined,接下來隨著if條件判斷進行解析賦值,當然是走ture方法。
ie9,ie10var sayHello; console.log(typeof (sayHey));//=>function console.log(typeof (sayHo));//=>undefined if (true) { function sayHey() { console.log("sayHey"); } sayHello = function sayHo() { console.log("sayHello"); } } else { function sayHey() { console.log("sayHey2"); } sayHello = function sayHo() { console.log("sayHello2"); } } sayHey();// => sayHey2 sayHello();// => sayHello
在這里的ie將所有的函數聲明進行了提升,從而由sayHey2替代了sayHey,函數表達式的在順著條件判斷進行了定義,執行為true的情況,進行賦值解析。
ie8var sayHello; console.log(typeof (sayHey));//=>function console.log(typeof (sayHello));//=>function if (true) { function sayHey() { console.log("sayHey"); } sayHello = function sayHo() { console.log("sayHello"); } } else { function sayHey() { console.log("sayHey2"); } sayHello = function sayHo() { console.log("sayHello2"); } } sayHey();// => sayHey2 sayHello();// => sayHello
ie8在這里處理的比較奇葩,正常的函數申明提升,但是卻也將條件判斷為假的情況進行了提升,我們看到typeof (sayHello)=>function
結論由于函數聲明提升的差異,想要在條件判斷中定義不同的函數方法,應該采用定義函數表達式的方法,這樣就在各個瀏覽器中拿到相同的函數方法,得到相同的結果。
var sayHello; console.log(typeof (sayHey));//=>undefined ie8以下解析為function console.log(typeof (sayHo));//=>undefined if (true) { var sayHey =function sayHey() { console.log("sayHey"); } } else { var sayHey =function sayHey() { console.log("sayHey2"); } } sayHey();// => sayHey
http://www.cnblogs.com/isaboy...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93786.html
摘要:在中,有四種方式可以讓命名進入到作用域中按優先級語言定義的命名比如或者,它們在所有作用域內都有效且優先級最高,所以在任何地方你都不能把變量命名為之類的,這樣是沒有意義的形式參數函數定義時聲明的形式參數會作為變量被至該函數的作用域內。 Scoping & Hoisting 例: var a = 1; function foo() { if (!a) { var ...
摘要:有兩種定義函數的方式函數聲明與函數表達式。所以在實際開發的時候,一定要注意變量函數的聲明會被提升到當前作用域的最前面 JS有兩種定義函數的方式:函數聲明與函數表達式。那么這兩種方式有區別嗎,還是一樣的呢?下面我們來進一步探討探討。 下面我們定義了兩個函數分別為 hello 和 hi,前者采用函數聲明,后者采用函數表達式,然后再調用,如下: function hello () { ...
摘要:函數聲明和函數表達式的區別函數聲明只能出現在程序或函數體內。所以,在等語義為語句的代碼塊中存在函數聲明,由于函數提升特性,會破壞掉原本的語義。 這篇談一下JS函數聲明與函數表達式的區別及要注意的地方: 函數聲明主要有兩種類型: 函數聲明 function fn() {}; 函數表達式 var fn = function () {}; 這兩種函數創建方式...
摘要:函數聲明函數聲明的語法說明函數聲明最重要的特征就是函數聲明提升,意思是在執行代碼之前就會讀取函數聲明例子不會報錯,因為函數聲明在在函數之前已經讀取函數表達式函數表達式的語法說明用函數表達式定義的函數在使用之前必須先賦值例子報錯,函數調用之前 1.函數聲明 函數聲明的語法: function functionName(arg0,arg1...) { //functionBody ...
摘要:最近在寫代碼時遇到了閉包,其中閉包又和立即執行函數有點關系,于是牽扯除了函數聲明以及函數表達式,我感覺中文的很多文章寫的不太好,查閱了的指南和這篇關于的文章,覺得寫的很好,整合一下。函數聲明和函數表達式。 最近在寫代碼時遇到了閉包,其中閉包又和立即執行函數(immediately invoked function expression, aka IIFE)有點關系,于是牽扯除了函數聲明...
閱讀 1279·2021-10-11 10:57
閱讀 2051·2021-09-02 15:15
閱讀 1613·2019-08-30 15:56
閱讀 1205·2019-08-30 15:55
閱讀 1163·2019-08-30 15:44
閱讀 985·2019-08-29 12:20
閱讀 1331·2019-08-29 11:12
閱讀 1073·2019-08-28 18:29