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