摘要:嚴格模式下,通常會采用內聯(lián)命名函數(shù)來解決這個問題。使用內聯(lián)方式調用,其本質和函數(shù)表達式沒有太大不同,唯一的區(qū)別就是內聯(lián)命名函數(shù)在函數(shù)內部提供了一個僅僅可供自身調用的函數(shù)指針,該指針指向函數(shù)自身。
在使用JavaScript遞歸調用時,我們往往會在函數(shù)內部調用函數(shù)自身(通過函數(shù)名),但是當我們改變了定義時所用函數(shù)名的指向時,那么這個遞歸函數(shù)指針關聯(lián)的遞歸函數(shù)也將隨之失效。
var factorial = function (num) { if (num <= 1) { return 1; } else { return num * factorial(num - 1); } }; console.log(factorial(5)); // 120; var anothorFactorial = factorial; factorial = null; console.log(anothorFactorial(5)); // Uncaught TypeError: factorial is not a function
在非嚴格模式下我們可以使用 num * arguments.callee(num - 1)來代替函數(shù)名。
嚴格模式下,通常會采用內聯(lián)命名函數(shù)來解決這個問題。
var factorial = (function f(num) { if (num <= 1) { return 1; } else { return num*f(num - 1); } }); console.log(factorial(5)); // 120 var anothorFactorial = factorial; factorial = null; console.log(anothorFactorial(5)); // 120
這種方式的函數(shù)調用區(qū)別于下面這種方式:
function f(num) { if (num <= 1) { return 1; } else { return num*f(num - 1); } }; var factorial = f; var anothorFactorial = factorial; factorial = null; console.log(anothorFactorial(5)); // 120 f = null; console.log(anothorFactorial(5)); // Uncaught TypeError: f is not a function
給函數(shù)表達式的匿名函數(shù)命名并不會改變表達式的性質,即不會讓它變成一個函數(shù)聲明
var factorial = function f() { console.log(factorial == f); // true } factorial(); //true console.log(typeof f); // undefined f(); // Uncaught ReferenceError: f is not defined
上述代碼證明:盡管我們可以給內聯(lián)函數(shù)命名,但是這些名稱只能在自身函數(shù)內部才是可見的。使用內聯(lián)方式調用,其本質和函數(shù)表達式沒有太大不同,唯一的區(qū)別就是內聯(lián)命名函數(shù)在函數(shù)內部提供了一個僅僅可供自身調用的函數(shù)指針,該指針指向函數(shù)自身。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/82495.html
摘要:作用域和閉包是最重要的概念之一,想要進一步學習,就必須理解作用域和閉包的工作原理。全局和局部作用域的關系在函數(shù)體內,局部變量的優(yōu)先級高于同名的全局變量。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權訪問的所有變量和函數(shù)的有序訪問。 作用域和閉包是 JavaScript 最重要的概念之一,想要進一步學習 JavaScript,就必須理解 JavaScript 作用域和閉包的工作原理。 作用域 任何...
摘要:只要沒有被覆蓋的話對象原型的屬性就能在所有的實例中找到,若整個原型鏈未找到則返回如何實現(xiàn)繼承構造繼承原型繼承實例繼承拷貝繼承原型機制或和方法去實現(xiàn)較簡單,建議使用構造函數(shù)與原型混合方式。 HTML相關問題 1.XHTML和HTML有什么區(qū)別 HTML是一種基本的WEB網頁設計語言,XHTML是一個基于XML的標記語言最主要的不同:XHTML 元素必須被正確地嵌套。XHTML 元素必須被...
摘要:只要沒有被覆蓋的話對象原型的屬性就能在所有的實例中找到,若整個原型鏈未找到則返回如何實現(xiàn)繼承構造繼承原型繼承實例繼承拷貝繼承原型機制或和方法去實現(xiàn)較簡單,建議使用構造函數(shù)與原型混合方式。 HTML相關問題 1.XHTML和HTML有什么區(qū)別 HTML是一種基本的WEB網頁設計語言,XHTML是一個基于XML的標記語言最主要的不同:XHTML 元素必須被正確地嵌套。XHTML 元素必須被...
摘要:只要沒有被覆蓋的話對象原型的屬性就能在所有的實例中找到,若整個原型鏈未找到則返回如何實現(xiàn)繼承構造繼承原型繼承實例繼承拷貝繼承原型機制或和方法去實現(xiàn)較簡單,建議使用構造函數(shù)與原型混合方式。 HTML相關問題 1.XHTML和HTML有什么區(qū)別 HTML是一種基本的WEB網頁設計語言,XHTML是一個基于XML的標記語言最主要的不同:XHTML 元素必須被正確地嵌套。XHTML 元素必須被...
摘要:反之亦然非嚴格合并嚴格看起來是非嚴格的。在普通的里面給一個拼寫錯誤的變量名賦值會使全局對象新增一個屬性并繼續(xù)工作盡管后面可能出錯在現(xiàn)在的中有可能。第三嚴格模式禁止刪除聲明變量。 文章整理自MSDN:https://developer.mozilla.org... 1.逐步使用嚴格模式 ECMAScript 5的嚴格模式是JavaScript中的一種限制性更強的變種方式。嚴格模式不是一個...
閱讀 3440·2021-11-19 09:40
閱讀 1339·2021-10-11 11:07
閱讀 4870·2021-09-22 15:07
閱讀 2903·2021-09-02 15:15
閱讀 1973·2019-08-30 15:55
閱讀 545·2019-08-30 15:43
閱讀 892·2019-08-30 11:13
閱讀 1460·2019-08-29 15:36