JavaScript模擬區域性變數整理

2021-08-17 22:08:33 字數 1750 閱讀 5426

在es5中變數邊界有兩個,一是全域性範圍,二是函式範圍,沒有一般語言的作用域範圍,比如

console.log(a); //1

上面會輸出1,然而我們希望a僅僅侷限於自己最近的括號內,而在括號外為未定義undefined,也即一般程式語言的區域性變數。

console.log(a); //undefine

非常完美,正常。然而作為乙個回憶吧,還是把過去的奇巧淫技整理如下。

---------------奇巧淫技-----------------------------------

很驚人,原來這樣簡單都可以形成區域性變數:

第一種var person = new object();

(function()

})(); //這裡執行後,生成了乙個原本應該馬上消失的作用域空間,但是因為被外界的person引用而不能釋放

alert(person.getname());

第二種var person = new object();

(function())(); //這裡執行後,函式內部變數被外部person引用 ???? alert(person.name);

以上是比較普遍的例子。從這個例子可見,這其實是一件很簡單的事情,其本質是:

1,函式內部變數是私有的

2,執行函式,生成其內部變數,但是讓外部物件引用這個內部變數

3,函式執行完畢,但是內部空間及內部變數被儲存下來了,而沒有被釋放

仔細想,我們究竟想要什麼樣的內部私有變數?我們的期望包括:

其一:不可以用點號來索引該變數,包括讀出或寫進,比如o.name

其二:可以通過某些方法來操作該變數

我們正好就實現了這兩點

繼續嘗試一下。

第三種:

var person = function();

alert(person.inner_name);//顯示undefined

alert(person.inside_name);//顯示undefined

本例person指向乙個靜止不動的函式物件,由於沒有執行,其函式內部作用域的變數是不存在的

第三種之二

var person = function();

person.new_name = "new_name"

alert(person.new_name);

這裡的new_name不是內部變數,而是person作為普通物件的屬性

第四種:

function func_inner();

var person = new func_inner();//當建構函式用,返回this

alert(person.name);//顯示inner_name

第五種:

function func_inner(name)

};var person = new func_inner("in_name");

alert(person.getname());//返回in_name

第六種:

var person = (function())();

alert(person.inner_name);//返回inner_name

總結:靜態存在的函式物件,其內部變數並不存在

函式物件執行了,其內部變數會生成,可以被return出來,也可以被引用出來,只要被指向,這些內部變數就不會丟失

被當成建構函式被呼叫也是一樣

可以直接引用,也可以通過方法來引用,我們需要的是,在引用出來後,只能通過方法操作,而不能用點號操作,這樣就形成了內部私有變數

javascript複習 全域性變數與區域性變數

全域性變數 global variable 可以在宣告它的指令碼中任何位置引用它。區域性變數 local variable 只存在於對它做出宣告的函式內部。因此在函式內部我們既可以使用全域性變數也可以使用這個函式的區域性變數。這可能會導致一些問題。如果在函式內部不小心使用了全域性變數的名字,即使本意...

JavaScript之區域性變數變為全域性變數

簡而言之 物件的前面加上 windo.即可另區域性變數變為全域性變數。案例 通過自呼叫函式產生乙個隨機數物件,在自呼叫函式外面,呼叫該隨機數物件方法產生隨機數 function window 在原型物件中新增方法 random.prototype.getrandom function max,min...

Android TextView 區域性文字變色

textview 對於富文字效果的實現支援不支援呢?比如 區域性文字顏色的變動 區域性字型的變動 一 需求效果 二 解決方案 針對這類問題,android提供了 spannablestringbuilder,方便我們自定義富文字的實現。textview textview findviewbyid r...