摘要:模仿塊級作用域在塊級語句中定義的變量,實際上是包含函數中而非語句中創建的。避免對全局作用域產生不良影響這種方式可以通過創建私有作用域,避免對全局作用域產生不良影響。一般包括函數的參數局部變量和內部定義的其他函數。
模仿塊級作用域
在塊級語句中定義的變量,實際上是包含函數中而非語句中創建的。如:
function outputNumbers(x){ for (var i = 0; i < x; i ++){ console.log(i); } var i; //即使重新聲明了變量仍然不起作用 console.log(i); //123 } outputNumbers(4); //4()()方法模仿塊級作用域
通常用塊級作用域(私有作用域)的匿名函數的語法來解決這個問題:
(function(){ //這里是塊級作用域 })();
無論什么地方,只要臨時需要一些變量,就可以使用私有作用域,如:
function outputNumbers(x){ (function(){ for (var i = 0; i < x; i ++){ console.log(i); } })() } outputNumbers(4); //0123
又如:
function outputNumbers(x){ (function(){ for (var i = 0; i < x; i ++){ console.log(i); } })() var i; console.log(i); //undefined } outputNumbers(4);
這樣一來,變量i 只能在循環中使用,使用后即被銷毀。實際上他也屬于閉包。
避免對全局作用域產生不良影響這種方式可以通過創建私有作用域,避免對全局作用域產生不良影響。
var num = 100; (function(){ if (num > 10){ console.log("greater than 10"); } })(); (function(){ if (num > 10){ console.log("greater than 10"); } })(); //兩者完全一樣,相互獨立,互不影響私有變量
在js 中,任何在函數中定義的變量,都可以認為是私有變量。一般包括函數的參數、局部變量和內部定義的其他函數。如:
function add(num1,num2){ var sum = num1 + num2; return sum; }
其中這個函數的內部就有3個私有變量:num1、num2 和sum。
另外我們把有權訪問私有變量和私有函數的公有方法稱為特權方法。如:
function MyObject(){ var privateVariable = 10; function privateFunction(){ return false; } this.publicMethod = function(){ privateVariable ++; return privateFunction(); }; } var x = new MyObject(); console.log(x.publicMethod()) ;//false
利用私有和特權成員,可以隱藏那些不應該被直接修改的數據。如:
function Person(name){ this.getName = function(){ return name; }; this.setName = function(setName){ name = setName; }; } var person = new Person("Oliver"); console.log(person.getName()); person.setName("Oli"); //Oliver console.log(person.getName()); //Oli靜態私有變量
私有作用域中定義私有變量和函數,同樣也可以創建特權方法,如:
(function(){ var privateValue = 10; function privateFunction(){ return false; } MyObject = function(){}; //沒有var 屬于全局變量,嚴格模式下會報錯 MyObject.prototype.publicMethod = function(){ privateValue ++; return privateFunction(); }; })(); var instance = new MyObject(); console.log(instance.publicMethod()); //false模塊模式
針對單例創建私有變量和特權方法。單例就是只有一個實例的對象。如:
var singleton = { name: value, method: function(){ } };
添加私有變量以及特權方法:
var singleton = function(){ var privateVariable = 10; function privateFunction(){ return false; } return { publicProperty: true, publicMethod: function(){ privateVariable++; privateFunction(); } }; }();
簡化:
var a = function(){ var x; function y(){}; return { z1, z2 }; }();增強的模塊模式
這種模式適合那些單例必須是某種類型的實例。如:
var singleton = function(){ var privateVariable = 10; function privateFunction(){ return false; } var object = new CustomType(); object.publicProperty = true; object.publicMethod = function(){ privateVariable++; return privateFunction(); }; return object; }();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78214.html
摘要:單體內置對象單體內置對象就是開發人員不必顯式地實例化內置對象,因為他們已經實例化了。前面的章節討論過了大多數內置對象,還定義了兩個單體內置對象和。 單體內置對象 單體內置對象就是開發人員不必顯式地實例化內置對象,因為他們已經實例化了。前面的章節討論過了大多數內置對象,ECMA-262 還定義了兩個單體內置對象:Global 和Math。 Global 對象 所有在全局作用域中定義的屬性...
摘要:如調用函數聲明函數不會報錯使用函數表達式則不可以報錯創建函數的兩種方式,一個是函數聲明如第一種方式一個是函數表達式如第二種方式。第二種函數創建方式創建的函數叫匿名函數或拉姆達函數,因為關鍵字后面沒有標識符。 函數表達式的基本概念 name屬性和函數提升 首先,name屬性,通過這個屬性可以訪問到給函數指定的名字。(非標準的屬性)如: function People(){}; cons...
摘要:類型每個函數都是類型的實例。如以上代碼可行,是因為在代碼開始值錢,解析器就已經通過一個名為函數聲明提升的過程,讀取并將函數聲明添加到執行環境中去。也可同時使用函數聲明和函數表達式,但在瀏覽器中會出錯。 Function 類型 每個函數都是Function 類型的實例。函數名實際上就是一個指向函數對象的指針,不會與某個函數綁定。 函數聲明方式創建Function,語法如下: functi...
摘要:類型通過類型來支持正則表達式。如由于構造函數的模式參數是字符串,所以在某些情況下要對字符串進行雙重轉義。而第二個循環使用構造函數在每次循環沖創建正則表達式。如另外,還有個用于存儲捕獲組的構造函數屬性。 EegExp 類型 ECMAScript 通過RegExp 類型來支持正則表達式。語法如下: var expression = / pattern / flags; 每個正則表達式都可...
摘要:深入理解原型和閉包王福朋博客園深入理解原型和閉包一切都是對象原文鏈接本文要點一切引用類型都是對象,對象是屬性的集合。每個對象都有一個,可稱為隱式原型。另外注意,構造函數的函數名第一個字母大寫規則約定。 深入理解javascript原型和閉包 王福朋 - 博客園 —— 《 深入理解javascript原型和閉包》 1. 一切都是對象 原文鏈接:http://www.cnblogs.com...
閱讀 2898·2021-10-14 09:42
閱讀 1249·2021-09-24 10:32
閱讀 2961·2021-09-23 11:21
閱讀 2844·2021-08-27 13:10
閱讀 3333·2019-08-29 18:41
閱讀 2200·2019-08-29 15:16
閱讀 1209·2019-08-29 13:17
閱讀 898·2019-08-29 11:22