簡體   English   中英

Javascript 命名空間 - 從對象文字表示法 (OLN) 更新數組值

[英]Javascript namespacing - updating an an array value from an object literal notation (OLN)

我在幾個 javascript 文件中使用 OLN 進行一些基本的命名空間。 這些文件的“邏輯層次結構”是這樣的:

-main.js
  -somefile.js
  -otherfile.js
  -....

main.js 管理所有頁面都需要的東西,但是根據加載的特定頁面 somefile.js 或 otherfile.js 可能會被加載(或兩者都沒有)。

在 main.js 中,這是語法:

主文件

var mainjs = { 
    someobjects: [baz],
    // more stuff
}

根據加載的頁面,加載其他 javascript 文件。 他們可能會將對象添加到該列表中,如下所示:

一些文件.js

let foo;
let bar;
$(function() {                          
    console.log( " somefile.js ready!" ); 
    mainjs.someobjects = mainjs.someobjects.concat([foo, bar])
}

如果我在頁面加載后查看控制台,我可以看到在mainjs.someobjects ,我有這 3 個對象。 “baz”已定義,我添加的另外兩個是“未定義”。 沒關系。

但是,當我稍后從somefile.js初始化這兩個對象時(用戶單擊某些內容),然后在控制台中我可以看到foobar都已定義。 但是,在mainjs.someobjects ,這兩個對象仍未定義。

我以為這些會作為參考傳遞,但顯然我錯了。 基本上,我要解決的問題是我有幾個不同的somefile.js ,它們可能會創建不同的對象(實際上是 dataTables),但它們僅在顯示包含它們的選項卡時才獲取數據(ajax 調用)。 然后我需要根據數據調整列寬。 數據表的一個已知問題,即在填充數據表之前創建 html 時。 需要調用 table.columns.adjust() 才能實現這一點。

所以:

  • 為什么我在mainjs變量仍未定義,我可以更改我的結構,以便以后將這些變量分配給對象時,它們實際上引用了該對象?
  • 或者另一種確保我的數據表被調整的方法。 但是,我寧願不必構建一個完全不同的結構來實現這一點。 我想我可以將調整列委托給定義它們的低級文件......

我以為這些會作為參考傳遞,但顯然我錯了。

是的,JavaScript 是一種純粹的值傳遞語言,而不是 JavaScript 原生模塊(“ESM”)所做的事情。

在我看來,您想使用 ESM。 在 ESM 中,當您導出模塊級綁定(松散地,“變量”)並且另一個模塊導入它時,另一個模塊具有只讀實時綁定,將其鏈接到原始導出的綁定 這意味着當導入它的模塊使用它時,它會看到源綁定的當前值(而不是導出時的值)。

因此,如果您使用 ESM 並執行了以下操作:

export let foo;
export let bar;

// ...code here that asynchronously or periodically updates `foo` and/or `bar`...

然后是一個導入它們的模塊:

import {foo, bar} from "./some-module.js";

...將通過這些實時綁定看到foobar的當前值。


如果您出於某種原因不想使用 ESM,您可以導出具有foobar屬性的對象,並讓其他代碼使用該導出的對象。 由於對象是穩定的(我們不會用不同的對象替換它),使用它的代碼可以可靠地訪問其foobar屬性並查看它們的當前值。

基本上,在somefile.js

const meaningfulName = {
    foo: undefined, // Or some more meaningful initial value
    bar: undefined, // Or some more meaningful initial value
};
$(function() {                          
    console.log( " somefile.js ready!" ); 
    // Just FWIW, I probably woudn't use an array for this, I'd use an object
    mainjs.someobjects = mainjs.someobjects.concat(meaningfulName);
}

然后使用該對象的代碼將使用其foobar屬性,並始終查看它們的當前值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM