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