首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JavaScript/jQuery 鏈式賦值 `var a = b = c` 含義與執行機制詳解

     編輯:程式設計疑難解答

代碼片段

function Pager($ele, options) {
    this.$ele = $ele;
    this.options = options = $.extend(defaults, options || {});
    this.init();
}

核心行:this.options = options = $.extend(defaults, options || {});

語法本質:賦值表達式的右結合性

JavaScript 中賦值運算符 `=` 是**右結合**,且賦值表達式**本身有值**(等於被賦予的值)。

a = b = c
// 解析為
a = (b = c)
// 步驟:
// 1. 執行 b = c  →  b 得到 c 的值,表達式值為 c 的值
// 2. 執行 a = (上一步結果)  →  a 得到 c 的值

等價展開

options = $.extend(defaults, options || {});  // ① 合併配置,結果賦給參數 options
this.options = options;                       // ② 將合併後的配置賦給實例屬性

為什麼這麼寫?雙重目的

  1. 合併默認配置:`$.extend(defaults, options || {})` 建立新對象,包含默認值與用戶傳入值的覆蓋。
  2. 同步參數變量與實例屬性:
    • 形參 `options` 是函數作用域局部變量。
    • `this.options` 是實例屬性,供外部訪問/修改。
    • 鏈式賦值確保**兩者引用同一合併後的對象**,後續若修改 `options.x = 1`,`this.options.x` 也會變,反之亦然。

內存引用圖解

執行前:
defaults  ──► {a:1, b:2}
options   ──► {b:20}          (用戶傳入)
this.options ──► undefined

$.extend 返回新對象 merged = {a:1, b:20}

執行後:
options   ──► merged
this.options ──► merged      // 同一對象
// 修改 options.c = 3  →  this.options.c 也為 3

常見誤區

最佳實踐建議

  1. 分開寫更清晰:除非極簡單場景,否則拆分為兩行並加註釋,降低認知負荷。
  2. 避免隱式全局:嚴格模式下 `'use strict';` 會禁止未聲明賦值,務必先 `let options = ...;`。
  3. 不可變合併模式:現代寫法偏向 `this.options = { ...defaults, ...options };`(展開運算符),生成新對象,避免副作用。

總結

`var a = b = c` 是利用賦值表達式**有值**且**右結合**的特性,實現「先計算右側,依次向左賦值」。在 jQuery 插件構造函數中,常用於**將合併後的配置對象同時賦給局部參數變量和實例屬性**,保持引用一致。理解「賦值表達式有值、右結合、對象傳引用」三大機制,即可輕鬆讀寫此類代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
誤解事實
以為是聲明三個變量無 `var/let/const`,`b` 和 `c` 若未聲明會成為全局變量(嚴格模式報錯)
以為 `a=b=c` 會創建副本對象賦值傳引用,三個變量指向**同一對象**
以為順序是左到右右結合:先算 `b=c`,再算 `a=結果`