亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript中的變量作用域以及變量提升詳細介紹

2019-11-20 21:51:00
字體:
來源:轉載
供稿:網友

變量作用域
“一個變量的作用域表示這個變量存在的上下文。它指定了你可以訪問哪些變量以及你是否有權限訪問某個變量。”

變量作用域分為局部作用域和全局作用域。

局部變量(處于函數級別的作用域)
不像其他對面對象的編程語言(比方說C++,Java等等),javascript沒有塊級作用域(被花括號包圍的);當是,javascript有擁有函數級別的作用域,也就是說,在一個函數內定義的變量只能在函數內部訪問或者這個函數內部的函數訪問(閉包除外,這個我們過幾天再寫個專題)。

函數級別作用域的一個例子:


復制代碼 代碼如下:

var name = "Richard";

function showName () {
    var name = "Jack"; // local variable; only accessible in this showName function
    console.log (name); // Jack
}
console.log (name); // Richard: the global variable

沒有塊級作用域:


復制代碼 代碼如下:

var name = "Richard";
// the blocks in this if statement do not create a local context for the name variable
if (name) {
    name = "Jack"; // this name is the global name variable and it is being changed to "Jack" here
    console.log (name); // Jack: still the global variable
}

// Here, the name variable is the same global name variable, but it was changed in the if statement
console.log (name); // Jack

//    不要忘記使用var關鍵字
//    如果聲明一個變量的時候沒有使用var關鍵字,那么這個變量將是一個全局變量!
// If you don't declare your local variables with the var keyword, they are part of the global scope
var name = "Michael Jackson";

function showCelebrityName () {
    console.log (name);
}

function showOrdinaryPersonName () {   
    name = "Johnny Evers";
    console.log (name);
}
showCelebrityName (); // Michael Jackson

// name is not a local variable, it simply changes the global name variable
showOrdinaryPersonName (); // Johnny Evers

// The global variable is now Johnny Evers, not the celebrity name anymore
showCelebrityName (); // Johnny Evers

// The solution is to declare your local variable with the var keyword
function showOrdinaryPersonName () {   
    var name = "Johnny Evers"; // Now name is always a local variable and it will not overwrite the global variable
    console.log (name);
}
//    局部變量優先級大于全局變量
//如果在全局作用域中什么的變量在局部作用域中再次聲明,那么在局部作用域中調用這個變量時,優先調用局部作用域中聲明的變量:
var name = "Paul";

function users () {
    // Here, the name variable is local and it takes precedence over the same name variable in the global scope
var name = "Jack";

// The search for name starts right here inside the function before it attempts to look outside the function in the global scope
console.log (name);
}

users (); // Jack

全局變量
所有在函數外面聲明的變量都處于全局作用域中。在瀏覽器環境中,這個全局作用域就是我們的Window對象(或者整個HTML文檔)。

每一個在函數外部聲明或者定義的變量都是一個全局對象,所以這個變量可以在任何地方被使用,例如:

復制代碼 代碼如下:

// name and sex is not in any function
var myName = "zhou";
var sex = "male";

//他們都處在window對象中
console.log(window.myName); //paul
console.log('sex' in window); //true


如果一個變量第一次初始化/聲明的時候沒有使用var關鍵字,那么他自動加入到全局作用域中。

復制代碼 代碼如下:

function showAge(){
  //age初始化時沒有使用var關鍵字,所以它是一個全局變量
  age = 20;
  console.log(age);
}

showAge();  //20
console.log(age); //因為age是全局變量,所以這里輸出的也是20

setTimeout中的函數是在全局作用域中執行的

setTimeout中的函數所處在于全局作用域中,所以函數中使用this關鍵字時,這個this關鍵字指向的是全局對象(Window):

復制代碼 代碼如下:

var Value1 = 200;
var Value2 = 20;
var myObj = {
  Value1 : 10,
  Value2 : 1,

  caleculatedIt: function(){
    setTimeout(function(){
      console.log(this.Value1 * this.Value2);
    }, 1000);
  }
}

myObj.caleculatedIt(); //4000

為了避免對全局作用域的污染, 所以一般情況下我們盡可能少的聲明全局變量。 
變量提升(Variable Hoisting)
所以的變量聲明都會提升到函數的開頭(如果這個變量在這個函數里面)或者全局作用域的開頭(如果這個變量是一個全局變量)。我們來看一個例子:

復制代碼 代碼如下:

function showName () {
console.log ("First Name: " + name);
var name = "Ford";
console.log ("Last Name: " + name);
}

showName ();
// First Name: undefined
// Last Name: Ford

// The reason undefined prints first is because the local variable name was hoisted to the top of the function
// Which means it is this local variable that get calls the first time.
// This is how the code is actually processed by the JavaScript engine:

function showName () {
    var name; // name is hoisted (note that is undefined at this point, since the assignment happens below)
console.log ("First Name: " + name); // First Name: undefined

name = "Ford"; // name is assigned a value

// now name is Ford
console.log ("Last Name: " + name); // Last Name: Ford
}

函數聲明會覆蓋變量聲明
如果存在函數聲明和變量聲明(注意:僅僅是聲明,還沒有被賦值),而且變量名跟函數名是相同的,那么,它們都會被提示到外部作用域的開頭,但是,函數的優先級更高,所以變量的值會被函數覆蓋掉。

復制代碼 代碼如下:

// Both the variable and the function are named myName
var myName;?
function myName () {
console.log ("Rich");
}

// The function declaration overrides the variable name
console.log(typeof myName); // function

但是,如果這個變量或者函數其中是賦值了的,那么另外一個將無法覆蓋它:

復制代碼 代碼如下:

// But in this example, the variable assignment overrides the function declaration
var myName = "Richard"; // This is the variable assignment (initialization) that overrides the function declaration.

function myName () {
console.log ("Rich");
}

console.log(typeof myName); // string

最后一點, 在嚴格模式下,如果沒有先聲明變量就給變量賦值將會報錯!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品中文字幕一区| 国产精品羞羞答答| 久久久久久久久久久成人| 国产拍精品一二三| 欧美日韩亚洲高清| 久久国产精品久久久久| 国自在线精品视频| 韩日精品中文字幕| 国产日韩一区在线| 在线视频欧美性高潮| 欧美性猛交99久久久久99按摩| 日韩欧美中文第一页| 欧美尺度大的性做爰视频| 日韩中文字幕亚洲| 亚洲美女中文字幕| 91精品久久久久久久久久另类| 欧美高清自拍一区| 欧美在线视频观看免费网站| 欧美又大又硬又粗bbbbb| 久久久久久成人精品| 欧美韩国理论所午夜片917电影| 色悠悠久久88| 91av视频在线观看| 日韩中文视频免费在线观看| 国产欧美va欧美va香蕉在| 久久成人精品电影| 亚洲精品欧美一区二区三区| 中文欧美在线视频| 精品国偷自产在线| 国产精品久久久久不卡| 国产精品久久久久久久久久久久久| 91国产在线精品| 色悠久久久久综合先锋影音下载| 久久夜色精品国产| 亚洲第一精品夜夜躁人人爽| 欧美日韩一区二区免费视频| 成人国产精品色哟哟| 亚洲va码欧洲m码| 一道本无吗dⅴd在线播放一区| 亚洲成色999久久网站| 国产精品电影在线观看| 免费91在线视频| 久久久精品一区二区三区| 国产精品第七影院| 欧美激情一区二区三区久久久| 日韩精品免费看| 欧美在线观看视频| 日本一区二区在线免费播放| 久久综合伊人77777尤物| 亚洲色图偷窥自拍| 亚洲男人天堂久| 欧美国产精品人人做人人爱| 国产精品69精品一区二区三区| 日韩在线免费高清视频| 欧美一区二区大胆人体摄影专业网站| 日韩电影网在线| 国a精品视频大全| 欧美在线视频免费播放| 福利二区91精品bt7086| www国产精品com| 日本免费一区二区三区视频观看| 91高清视频在线免费观看| 国产精品专区一| 播播国产欧美激情| 国产精品日韩一区| 色妞欧美日韩在线| 一区二区三区黄色| 日韩av片免费在线观看| 国产91精品黑色丝袜高跟鞋| 这里只有精品丝袜| 57pao国产成人免费| 国产亚洲欧美日韩精品| 国产精品久久网| 激情成人在线视频| 亚洲人成亚洲人成在线观看| 中文字幕精品av| 国内精品视频久久| 国产成人+综合亚洲+天堂| 欧美精品在线第一页| 精品偷拍各种wc美女嘘嘘| 精品国产网站地址| 国产精品av免费在线观看| 亚洲图片欧洲图片av| 91久久综合亚洲鲁鲁五月天| 亚洲人精选亚洲人成在线| 欧美孕妇孕交黑巨大网站| 欧美日韩中国免费专区在线看| 久久99国产精品久久久久久久久| 久久久国产精品亚洲一区| 中文字幕久热精品视频在线| 一区二区三欧美| 国产精品免费视频久久久| 欧美高清理论片| 国内精久久久久久久久久人| 亚洲成人精品在线| 欧美电影《睫毛膏》| 欧美福利视频在线观看| 综合136福利视频在线| www.日韩不卡电影av| 97久久国产精品| 亚洲综合一区二区不卡| 欧美视频中文在线看| 97色在线视频| 美女啪啪无遮挡免费久久网站| 爽爽爽爽爽爽爽成人免费观看| 日韩高清欧美高清| 中文字幕国产亚洲2019| 正在播放欧美视频| 日韩精品视频免费专区在线播放| 欧洲s码亚洲m码精品一区| 伊人久久久久久久久久久| 亚洲日本成人女熟在线观看| 亚洲区bt下载| 国产精品丝袜视频| 国产精品69久久| www.亚洲一区| 国产精品久久电影观看| 福利二区91精品bt7086| 91美女片黄在线观看游戏| 91沈先生作品| 日韩小视频在线观看| 亚洲国产又黄又爽女人高潮的| 亚洲电影免费观看高清完整版在线观看| 欧美国产日韩xxxxx| 久久视频免费在线播放| 国产精品精品久久久| 成人精品视频99在线观看免费| 欧美老少做受xxxx高潮| 国产精品视频1区| 91探花福利精品国产自产在线| 国产乱肥老妇国产一区二| 成人免费视频在线观看超级碰| 国产91在线高潮白浆在线观看| 亚洲97在线观看| 欧美日韩裸体免费视频| 欧美视频在线观看免费| 69久久夜色精品国产69| 日韩av在线免费播放| 国产精品流白浆视频| 亚洲精选在线观看| 欧美日韩一区免费| 岛国精品视频在线播放| 一区二区三区 在线观看视| 欧美亚洲日本网站| 91欧美日韩一区| 国产精品对白刺激| 欧洲午夜精品久久久| 97在线视频精品| 欧美电影免费在线观看| 国产欧美一区二区三区久久| 久久久在线免费观看| 在线精品高清中文字幕| 国产精品h在线观看| 亚洲精品一区二区在线| 欧美午夜丰满在线18影院| 岛国av在线不卡| 欧美性猛交xxxx富婆弯腰| 久久亚洲精品中文字幕冲田杏梨| 国产欧美久久一区二区| 热re99久久精品国产66热| 国模视频一区二区三区| 97超级碰在线看视频免费在线看| 日韩精品免费在线视频观看| 久久精品亚洲一区|