標籤:
1.JS無塊級範圍
<script> function Main(){ if (1==1){ var name = "alex"; } console.log(name); } Main(); </script>
執行結果:{}即塊級範圍。
alex
2.JS採用函數作為範圍鏈
<script> function Main(){ var innerValue = "alex"; } Main(); console.log(innerValue); </script>
執行結果:
Uncaught ReferenceError: innerValue is not defined
3.JS的範圍鏈在建立前已經產生了
樣本一:
<script> xo = "alex"; function Func(){ var xo = "seven"; function inner(){ console.log(xo); } return inner; } var ret = Func(); ret(); </script>
執行結果:產生的範圍鏈為 xo("alex")----xo("undefined")----xo(使用範圍鏈)
seven
樣本二:
<script> xo = "alex"; function Func(){ var xo = "eric"; function inner(){ console.log(xo); } xo = "seven"; return inner; } var ret = Func(); ret(); </script>
執行結果:產生的範圍鏈xo("alex")----xo("undefined")----xo("undefined")----Func[xo]("eric")----Func[xo]("seven")----inner()
seven
樣本三:
<script> xo = "alex"; function Bar(){ console.log(xo); } function Func(){ var xo = "seven"; return Bar; } var ret = Func(); ret(); </script>
執行結果:範圍鏈分為二段:1.xo("alex")----xo
2.xo("alex")----xo("undefined")----Func[xo]("seven")
alex
閉包:如果每個下載的JS都有自訂的全域變數,那麼在匯入的時候就會發生相互覆蓋的現象,通過閉包可以將變數鎖定在函數內。
(function(){ var a = 123; function f1(){ console.log(a); } function f2(){ cocnsole.log(a); }})();
物件導向JS
<script> function Foo(name,age){ this.name = name; this.age = age; } Foo.prototype = { GetInfo:function(){ return this.name + this.age; }, Func:function(arg){ return this.name + arg; } } var obj = new Foo(‘alex‘,22); console.log(obj.name); console.log(obj.GetInfo()); console.log(obj.Func(55)); </script>
執行結果:
alexalex22alex55
JS 之範圍鏈和閉包