DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> 關於JavaScript >> JavaScript閉包和范圍實例詳解
JavaScript閉包和范圍實例詳解
編輯:關於JavaScript     

本文實例分析了JavaScript閉包和范圍。分享給大家供大家參考,具體如下:

1.

if (!("a" in window)) {
  var a = 1;
}
alert(a);

【分析】代碼含義:如果window不包含屬性a,就聲明一個變量a並賦值為1

①JS引擎會先掃描所有的變量聲明

②所有的全局變量都是window的屬性

③變量聲明和賦值一起用時,Js引擎會自動將它分成兩部分:變量聲明提前,變量賦值沒有(不將賦值提前是因為他有可能影響代碼執行出不可預期的結果)

所以代碼執行順序等價於

var a;
if(!("a" in window)) {
  a = 1;
}
alert(a);

解析:聲明變量a,判斷a是否存在,不存在就賦值為1,而這裡a永遠在window裡存在,賦值語句永不執行,所以結果是undefined

2.

if (!("a" in window)) {
  function a() { window.a = 1; }
}
alert(a);

【分析】

①函數聲明也會提前並且會覆蓋變量聲明,但不會覆蓋變量賦值,如下例子

function value(){
  return 1;
}
var value;
alert(typeof value);  //"function"

function value(){
  return 1;
}
var value = 1;
alert(typeof value);  //"number"

②所有全局變量都是window屬性,語句var a=1;等同於window.a=1;

所以代碼執行順序等價於

function a() {window.a = 1;}
if(!("a" in window)) {
  function a() { var a = 1; }
}
alert(a);

輸出結果:function a() {window.a = 1; }

變形:

if ("a" in window) {
  function a() { window.a = 1; }
}
alert(a);

輸出結果:a is not defined

函數聲明裡的變量定義,要到執行函數時才會定義,並不會在預編譯階段就聲明變量

3.

if (!("a" in window)) {
  var a = function () { window.a = 1; }
}
alert(a);

【分析】

①函數聲明和函數表達式區別

函數聲明:

function functionName(arg1, arg2){
  //函數體
}

函數表達式(相當於變量賦值):

var functionName = function(arg1, arg2){
  //函數體
};

所以代碼執行順序等價於

var a;
if (!("a" in window)) {
  a = function () { window.a = 1; }
}
alert(a);

結果和第一題一樣,undefined

4.

var a = 1,
  b = function a(x) {
    x && a(--x);
  };
alert(a);

【分析】

①進入執行上下文的階段

VO(global) = {
  a: undefined,
  b: undefined
}

這階段的順序:函數的形參->函數聲明->變量聲明

②執行代碼階段

VO(global) = {
  x: undefined,
  a: 1
}

③定義變量b,賦值名字為a的函數(這個a只能在函數體內使用)

④如果x是任何true值(這這裡應該是非0)則執行後面的語句

⑤換成更能理解的代碼

var a = 1,
  b = function(x) {
    x && b(--x);
  };
alert(a);

結果為1

5.

function b(x, y, a) {
  arguments[2] = 10;
  alert(a);
}
b(1, 2, 3);

【分析】沒有難點,輸出10,如果改成

function b(x, y, a) {
  arguments[2] = 10;
  alert(a);
}
b(1, 2);

則輸出undefined,因為沒有傳遞a的值

6.

function a() {
  alert(this);
}
a.call(null);

【分析】

①a.call(b)表示a對象的方法應用到b對象上(即b對象繼承了a對象),根據規定,第一個參數是null或undefined,call方法就把全局對象(也就是window)作為this的值

②call()和apply()的區別:功能一樣,第二個參數形式不一樣,call傳遞多個參數,任意形式,apply第二個參數必須是數組形式,如

a.call(b,2,3); ==>  a.apply(b,[2,3]);

輸出結果:[object Window]

更多關於JavaScript相關內容可查看本站專題:《javascript面向對象入門教程》、《JavaScript中json操作技巧總結》、《JavaScript切換特效與技巧總結》、《JavaScript查找算法技巧總結》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved