欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一次讓你了解全部JavaScript的作用域

 更新時間:2019年06月24日 09:39:22   作者:前端先鋒  
這篇文章主要介紹了一次讓你了解全部JavaScript的作用域,作用域決定了變量的生命周期和可見性,變量在作用域范圍之外是不可見的。,需要的朋友可以參考下

前言

作用域決定了變量的生命周期和可見性,變量在作用域范圍之外是不可見的。

JavaScript 的作用域包括:模塊作用域,函數作用域,塊作用域,詞法作用域和全局作用域。

全局作用域

在任何函數、塊或模塊范圍之外定義的變量具有全局作用域??梢栽诔绦虻娜我馕恢迷L問全局變量。
當啟用模塊系統(tǒng)時,創(chuàng)建全局變量會變得困難,但仍然可以做到這一點。可以在 HTML 中定義一個變量,這個變量需要在函數之外聲明,這樣就可以創(chuàng)建一個全局變量:

<script>
let GLOBAL_DATA = { value : 1};
</script>
console.log(GLOBAL_DATA);

當沒有模塊系統(tǒng)時,創(chuàng)建全局變量會容易很多。在任何文件中的函數外聲明的變量都是全局變量。
全局變量貫穿于程序的整個生命周期。

另一種創(chuàng)建全局變量的方法是在程序的任意位置使用 window 全局對象:

window.GLOBAL_DATA = { value: 1 };

這樣 GLOBAL_DATA 變量會隨處可見。

console.log(GLOBAL_DATA)

不過你也知道這種做法是不好的。

模塊作用域

如果不啟用模塊,在所有函數之外聲明的變量是全局變量。在模塊中,在函數外部聲明的變量都是隱藏的,除非顯式導出,否則不可用于其他模塊。

導出使函數或對象可用于其他模塊。在這個例子中,我從模塊文件 sequence.js 中導出了一個函數:

// in sequence.js
export { sequence, toList, take };

當前模塊可以通過導入來使用其他模塊的函數或對象成。

import { sequence, toList, toList } from "./sequence";

在某種程度上,我們可以認為模塊是一個自動執(zhí)行的函數,它將 import 的數據作為輸入,然后返回 export 的數據。

函數作用域

函數作用域意味著在函數中定義的參數和變量在函數內的任何位置都可見,但是在函數外部不可見。

下面是一個自動執(zhí)行的函數,被稱為IIFE。

(function autoexecute() {
let x = 1;
})();
console.log(x);
//Uncaught ReferenceError: x is not defined

IIFE 的意思是立即調用函數表達式,是一個在定義后立即運行的函數。

用 var 聲明的變量只有函數作用域。更重要的是,用 var 聲明的變量被提升到其作用域的頂部。通過這種方式,可以在聲明之前訪問它們。看看下面的代碼:

function doSomething(){
console.log(x);
var x = 1;
}
doSomething(); //undefined

這種事不會發(fā)生在 let 中。用 let 聲明的變量只能在定義后訪問。

function doSomething(){
console.log(x);
let x = 1;
}
doSomething();
//Uncaught ReferenceError: x is not defined

用 var聲明的變量可以在同一作用域下多次重新聲明:

function doSomething(){
var x = 1
var x = 2;
console.log(x);
}
doSomething();

用 let 或 const 聲明的變量不能在同一作用域內重新聲明:

function doSomething(){
let x = 1
let x = 2;
}
//Uncaught SyntaxError: Identifier 'x' has already been declared

也許我們可以不必關心這一點,因為 var 已經開始變得過時了。

塊作用域

塊作用域用花括號定義。它由 { 和 } 分隔。

用 let 和 const 聲明的變量可以受到塊作用域的約束,只能在定義它們的塊中訪問。

思考下面這段關于 let 塊范圍的代碼:

let x = 1;
{ 
let x = 2;
}
console.log(x); //1

相反,var 聲明不受塊作用域的約束:

var x = 1;
{ 
var x = 2;
}
console.log(x); //2

另一個常見問題是在循環(huán)中使用類似 setTimeout() 的異步操作。下面的循環(huán)代碼將顯示五次數字 5。

(function run(){
for(var i=0; i<5; i++){
setTimeout(function logValue(){
console.log(i); //5
}, 100);
}
})();

帶有 let 聲明的 for 循環(huán)語句在每次循環(huán)都會創(chuàng)建一個新的變量并設置到塊作用域。下一段循環(huán)代碼將會顯示 0 1 2 3 4 5。

(function run(){
for(let i=0; i<5; i++){
setTimeout(function log(){
console.log(i); //0 1 2 3 4
}, 100);
}
})();

詞法作用域

詞法作用域是內部函數訪問定義它的外部作用域的能力。

看一下這段代碼:

(function autorun(){
let x = 1;
function log(){
console.log(x);
};
function run(fn){
let x = 100;
fn();
}
run(log);//1
})();

log 函數是一個閉包。它從父函數 autorun() 引用 x 變量,而不是 run() 函數中的 x 變量。

閉包函數可以訪問創(chuàng)建它的作用域,而不是它自己的作用域。

autorun() 的局部函數作用域是 log() 函數的詞法作用域。

作用域鏈

每個作用域都有一個指向父作用域的鏈接。當使用變量時,JavaScript 會向下查看作用域鏈,直到它找到所請求的變量或者到達全局作用域(即作用域鏈的末尾)。

看下面這個例子:

let x0 = 0;
(function autorun1(){
let x1 = 1;
(function autorun2(){
let x2 = 2;
(function autorun3(){
let x3 = 3;
console.log(x0 + " " + x1 + " " + x2 + " " + x3);//0 1 2 3
})();
})();
})();

內部函數 autorun3() 可以訪問本地 x3 變量。還可以從外部函數訪問變量 x1 和 x2 和全局變量 x0 。

如果找不到變量,它將在嚴格模式下返回錯誤。

"use strict";
x = 1;
console.log(x)
//Uncaught ReferenceError: x is not defined

非嚴格模式也被稱為“草率模式”,它會草率的創(chuàng)建一個全局變量。

x = 1;
console.log(x); //1

總結

在全局作用域中定義的變量可在程序的任何位置使用。

在模塊中,在函數外部聲明的變量都是隱藏的,除非被顯式導出,否則不可用于其他模塊。

函數作用域意味著函數中定義的參數和變量在函數的任意位置都可見

用 let 和 const 聲明的變量具有塊作用域。 var 沒有塊作用域。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • JS+CSS實現的日本門戶網站經典選項卡導航效果

    JS+CSS實現的日本門戶網站經典選項卡導航效果

    這篇文章主要介紹了JS+CSS實現的日本門戶網站經典選項卡導航效果,涉及JavaScript針對頁面元素的動態(tài)遍歷及樣式動態(tài)修改技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • js流動式效果顯示當前系統(tǒng)時間

    js流動式效果顯示當前系統(tǒng)時間

    這篇文章主要為大家詳細介紹了js實現流動式時間效果的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • JavaScript?DOM?API的使用教程及綜合案例

    JavaScript?DOM?API的使用教程及綜合案例

    dom是Document Object Model的縮寫,即文檔對象模型,是基于文檔編程的一套API接口,下面這篇文章主要給大家介紹了關于JavaScript?DOM?API的使用教程及綜合案例的相關資料,需要的朋友可以參考下
    2023-03-03
  • javascript 掃雷游戲

    javascript 掃雷游戲

    最近心血來潮,用JavaScript實現了Windows自帶的掃雷游戲。當前只實現了基本功能,還有一個缺點就是只能在IE上正常運行,估計是事件沒有處理好。
    2009-05-05
  • JavaScript變量Dom對象的所有屬性

    JavaScript變量Dom對象的所有屬性

    這篇文章主要介紹了JavaScript變量Dom對象的所有屬性,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • JavaScript實現提交模式窗口后刷新父窗口數據的方法

    JavaScript實現提交模式窗口后刷新父窗口數據的方法

    這篇文章主要介紹了JavaScript實現提交模式窗口后刷新父窗口數據的方法,涉及javascript窗口交互的相關操作技巧,需要的朋友可以參考下
    2017-06-06
  • JavaScript中有關一個數組中最大值和最小值及它們的下表的輸出的解決辦法

    JavaScript中有關一個數組中最大值和最小值及它們的下表的輸出的解決辦法

    這篇文章主要介紹了JavaScript中有關一個數組中最大值和最小值及它們的下表的輸出的一種解決辦法,本文還給大家介紹了js快速獲取數組中最大值和最小值的方法,非常不錯,需要的朋友可以參考下
    2016-07-07
  • js實現在網頁上簡單顯示時間的方法

    js實現在網頁上簡單顯示時間的方法

    這篇文章主要介紹了js實現在網頁上簡單顯示時間的方法,實例分析了javascript實時顯示時間的技巧,需要的朋友可以參考下
    2015-03-03
  • next.js?getServerSideProps源碼解析

    next.js?getServerSideProps源碼解析

    這篇文章主要為大家介紹了next.js?getServerSideProps源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • js利用cookie實現記住用戶頁面操作

    js利用cookie實現記住用戶頁面操作

    這篇文章主要給大家介紹了關于js利用cookie實現記住用戶頁面操作的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03

最新評論