JS自定義函數(2)

1. 變量的作用域

全局變量

  • 定義:在函數外聲明的變量

  • 作用范圍:在整個JS文檔中生效

  • 生命周期:頁面關閉時銷毀

局部變量

  • 定義:在函數內用?var?聲明的變量

  • 作用范圍:只能在函數內部使用

  • 生命周期:函數執行完畢時銷毀

作用域規則

1.1 全局變局部
  • 全局變量可以在函數內部的任意位置使用

1.2 局部變全局
  • 局部變量不能在全局使用

  • 兩種方法在全局使用局部變量:

    1. 去除?var?關鍵字(隱式全局變量,不推薦)

    2. 使用?return?返回變量值

塊級作用域(ES6新增)

  • let?和?const?聲明的變量具有塊級作用域

  • 只在聲明它們的?{}?內有效

2. 作用域鏈

概念

  • 函數中如果在當前作用域中沒有查到值,就會向上級作用域去查

  • 直到查到全局作用域,這樣形成的鏈條就叫做作用域鏈

特點

  • 內部環境可以通過作用域鏈訪問所有外部環境

  • 外部環境不能訪問內部環境的任何變量和函數

示例分析

var n = 10;
function outer(){function inner(){function center(){console.log(n); // 輸出 undefined}center();}inner();var n = 15; // 變量提升,但賦值在console之后
}
outer();

3. 預解析(變量提升)

執行過程

  1. 預解析階段:提前加載所有?var?和?function

  2. 代碼執行階段:按書寫順序執行

預解析規則

  • var:只聲明不定義(值為?undefined

  • function:既聲明又定義(包含函數體)

  • 函數優先級高于變量

  • 預解析只發生在當前作用域下

優先級順序

  1. 函數聲明(最高優先級)

  2. 變量聲明

  3. 代碼執行

4. 案例分析

案例1

var num = 10;
fun();
function fun(){console.log(num); // undefinedvar num = 20;
}

案例2

var num = 10;
function fun() {console.log(num); // undefinedvar num = 20;console.log(num); // 20
}
fun();

案例3

var a = 18;
f1();
function f1() {var b = 9;console.log(a); // undefinedconsole.log(b); // 9var a = 13;
}

案例4

console.log(a, b, c); // undefined undefined undefined
var a = b = c = 5; // b和c成為隱式全局變量

案例5

f1();
console.log(c); // 9
console.log(b); // 9
console.log(a); // 報錯
function f1() {var a = b = c = 9; // 只有a是局部變量console.log(a); // 9console.log(b); // 9console.log(c); // 9
}

案例6

fn(); // 報錯
var fn = function(){console.log(11);
}

案例7

function fn(){console.log(a); // 報錯a = 100;
}
fn();
console.log(a);

案例8

console.log(show); // function show
function show(){console.log(123);
}
var show = 10;

案例9

function show(){console.log(123);
}
var show = 10;
console.log(show); // 10

5. 重要概念總結

變量提升等價代碼

// 原始代碼
console.log(a);
var a = 'hello';
function a(){console.log(123);
}// 提升后等價代碼
function a(){console.log(123);
}
// var a; // 被忽略
console.log(a); // function a
a = 'hello';

作用域鏈案例

var a = 1
function fn1(){function fn2(){console.log(a) // 輸出2}function fn3(){var a = 4fn2()}var a = 2return fn3
}
var fn = fn1()
fn()

6. 最佳實踐

  1. 使用?let/const?代替?var

  2. 避免隱式全局變量

  3. 函數優先使用函數表達式

  4. 啟用嚴格模式?"use strict"

  5. 變量聲明放在作用域頂部

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93856.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93856.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據集】Argoverse 數據集:自動駕駛研究的強大基石

Argoverse數據集:自動駕駛研究的強大基石 在自動駕駛技術蓬勃發展的當下,高質量的數據集對于推動相關算法研究和模型訓練起著舉足輕重的作用。Argoverse 數據集便是其中的佼佼者,它為自動駕駛領域的眾多任務提供了豐富且優質的數據資源。 一、…

--- 哈希表和哈希沖突 ---

哈希(散列)方法是對插入的數據通過哈希函數計算出一個哈希地值,并將這個哈希地址作為儲存改數據的地址,這樣下次再查找這個數據時,只需要通過哈希函數再獲取到該地址然后直接去拿就好這樣就做到了不經過任何比較&#…

數學建模-評價類問題-優劣解距離法(TOPSIS)

1-AI帶你認識TOPSIS📘 一、TOPSIS 方法簡介1. ??基本定義:????TOPSIS(Technique for Order Preference by Similarity to an Ideal Solution)??,中文通常稱為:???優劣解距離法?????逼近理想…

Go協程:從匯編視角揭秘實現奧秘

🚀 Go協程:從匯編視角揭秘實現奧秘 #Go語言 #協程原理 #并發編程 #底層實現 引用: 關于 Go 協同程序(Coroutines 協程)、Go 匯編及一些注意事項。 🌟 前言:重新定義并發編程范式 在當今高并發…

MySQL 事務(重點)

MySQL 這個東西注定是可能會被多個用戶/客戶端來同時訪問的,這是肯定的,MySQL 中存放的都是數據,數據可能有一個上層線程在用,也有可能另一個線程也要用...數據是被所有人共享的,所以就注定了 MySQL 這樣的服務在一個時…

uniapp:h5鏈接拉起支付寶支付

場景:APP內點擊支付寶支付,后臺返回類似鏈接https://qr.alipay.com/bax***********c3050 通常做法是,使用plus.runtime.openURL(deeplink);先打開瀏覽器,瀏覽器會提示打開支付寶,之后是支付流程。現在可以省略跳轉h5的…

吳恩達 Machine Learning(Class 3)

Week 11.1 K-means Cluster centroidK-means 是無監督學習中聚類算法的一種,核心在于更新聚類質心;首先將每個點分配給幾個聚類質心,取決于那些點離哪個質心更近;然后將幾個聚類質心移動到分配給他的所有點的平均值,不…

MyBatis 動態查詢語句詳解:讓 SQL 更靈活可控

MyBatis 動態查詢語句詳解:讓 SQL 更靈活可控 在日常的數據庫操作中,我們經常會遇到需要根據不同條件拼接 SQL 語句的場景。比如查詢用戶時,可能需要根據姓名、年齡、性別等多個條件進行篩選,而這些條件往往是動態變化的 —— 有時…

Java基礎語法three

一、一維數組一維數組初始化數據類型[] 數組名new 數據類型[數組長度]//動態初始化數據類型[] 數組名new 數據類型[]{值}//靜態初始化數據類型[] 數組名{值}數組長度一旦確定,就不可更改。數組是序排序;數組屬于引用數據類型的變量,數組的元素…

【數據結構】排序算法全解析:概念與接口

1.排序的概念及其運用 1.1 排序的概念 排序:所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。 穩定性:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的…

在 CentOS 7 上使用 LAMP 架構部署 WordPress

CentOS 7 LAMP 架構部署 WordPress全步驟本文將詳細介紹如何在 CentOS 7 系統上通過 LAMP(Linux Apache MariaDB PHP)架構部署 WordPress 博客平臺。 在CentOS 7上基于LAMP架構部署WordPress 一、系統基礎配置 1. 修改主機名(本機IP&#…

Node.js導入MongoDB具體操作

在Node.js應用程序中,導入MongoDB是一項常見任務。本文將詳細介紹如何在Node.js中連接和操作MongoDB數據庫,包括安裝必要的包、配置連接、執行基本的CRUD操作等步驟。1. 安裝必要的包首先,確保你已經安裝了Node.js和npm。然后,通過…

HTML--pre標簽的作用

原文網址&#xff1a;HTML--pre標簽的作用-CSDN博客 簡介 本文介紹HTML里pre標簽的作用。 <pre> 元素表示預定義格式文本。里邊的文本會保留原格式&#xff0c;以等寬字體的形式展現出來&#xff0c;文本中的空白符&#xff08;比如空格和換行符&#xff09;都會顯示出…

機器學習--數據預處理

目錄 一、數據清洗&#xff1a;讓數據純凈如新 1、缺失值處理&#xff1a; 2、異常值處理 3、重復值處理 二、數據變換&#xff1a;重塑數據的 “形狀” 1、歸一化 2、標準化 三、總結與展望 機器學習小白必看&#xff1a;數據預處理實戰筆記 最近投身于機器學習的學習…

Python 數據可視化:Matplotlib 與 Seaborn 實戰

Python 數據可視化&#xff1a;Matplotlib 與 Seaborn 實戰????在當今數據驅動的時代&#xff0c;數據可視化成為了理解和傳達數據信息的關鍵手段。Python 作為一門強大的編程語言&#xff0c;擁有豐富的數據可視化庫&#xff0c;其中 Matplotlib 和 Seaborn 尤為突出。本文…

計算機網絡技術學習-day4《路由器配置》

目錄 一、路由器基礎認知 1. 路由器的核心功能 2. 路由器與交換機的區別 二、路由器配置基礎操作 1. CLI&#xff08;命令行界面&#xff09;模式體系 2. 基礎配置命令示例 &#xff08;1&#xff09;基礎信息配置 &#xff08;2&#xff09;接口IP地址配置&#xff08;…

IDEA(十四) IntelliJ Idea 常用快捷鍵(Mac)

目錄準備&#xff1a;Mac鍵盤符號和修飾鍵說明一、編輯類快捷鍵二、Search/Replace&#xff08;查詢/替換&#xff09;三、編譯、運行四、debug 調試五、Navigation&#xff08;導航&#xff09;六、Refactoring&#xff08;重構&#xff09;七、VCS/Local History八、Live Tem…

八月月報丨MaxKB在教育及教學科研領域的應用進展

在2025年5月的“MaxKB用戶應用月度報告”中&#xff0c;我們對MaxKB開源智能體平臺在教育行業的典型應用場景進行了總結。MaxKB在教育行業的應用主要集中在教學輔助、學術研究、校園服務、行政辦公、財務管理、招生等場景。 目前&#xff0c;“DeepSeekMaxKB”的組合正在被包括…

一周學會Matplotlib3 Python 數據可視化-繪制自相關圖

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

第三十三天(信號量)

非常非常非常.....的重要在共享內存的代碼里面p1.c實質是有問題lt._flag 1;//這里先置1if(c Q)sprintf(lt._buf,"quit");elsesprintf(lt._buf,"大家好&#xff0c;%d 我系渣渣輝. %d 是兄弟就來砍我吧!!! %d",i,i1,i2);while(*((int *)shmptr));//如果別…